如何解决时区转换错误?



我正在尝试使用以下代码转换为瑞典时区:

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 时区数据库">的部分中阅读有关此内容的更多信息。
  • 由于您似乎正在寻找特定时区的当前时间,因此您根本不应该通过本地时区。 只需直接从 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);

相关内容

  • 没有找到相关文章

最新更新