我正在尝试使用以下代码转换为瑞典时区:
Thread.CurrentThread.CurrentCulture = new CultureInfo("sv-SE");
TimeZoneInfo cet = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
DateTime currentDate = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
var swedishTime = TimeZoneInfo.ConvertTime(currentDate, cet, TimeZoneInfo.Local);
出于某种原因,我得到:
{"转换无法完成,因为提供的日期时间 未正确设置 Kind 属性。例如,当 Kind 属性为 DateTimeKind.Local,源时区必须是 时区信息.本地。\r参数名称: 源时区"}
我错过了什么?
几件事:
-
区域性仅在转换为字符串/从字符串转换时影响输出格式。 它不会影响时区转换,因此此处没有必要。
Windows 上的
TimeZoneInfo
使用的时区标识符来自 Windows 操作系统本身,有时它们的名称与预期不匹配。- 您使用的是 Windows 时区 ID
"Central European Standard Time"
,其显示名称为"(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb"
。 - 对于瑞典,您实际上应该使用 ID
"W. Europe Standard Time"
,其显示名称为"(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna"
- 您可以在时区标记 wiki 中标题为"Microsoft Windows 时区数据库">的部分中阅读有关此内容的更多信息。
- 您使用的是 Windows 时区 ID
由于您似乎正在寻找特定时区的当前时间,因此您根本不应该通过本地时区。 只需直接从 UTC 转换为目标时区即可。
代码应该只是:
var tz = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
var swedishTime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tz);
或者,如果您愿意,可以使用方便的方法:
var swedishTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow,
"W. Europe Standard Time")
只需从"var swedishTime"中删除"TimeZoneInfo.Local"。
Thread.CurrentThread.CurrentCulture = new CultureInfo("sv-SE");
TimeZoneInfo cet = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
DateTime currentDate = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
var swedishTime = TimeZoneInfo.ConvertTime(currentDate, cet);
我遇到了同样的问题,我通过更改为DateTimeKind.Unspecified
来修复它。
取而代之的是这个
var currentDateTime = DateTime.UtcNow;
我把这个:
var currentDateTime = new DateTime(DateTime.UtcNow.Ticks, DateTimeKind.Unspecified);