关于c#:如何解决时区转换错误?

How to solve timezone conversion error?

我想用以下代码转换为瑞典时区:

1
2
3
4
5
6
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);

出于某种原因,我得到:

{"The conversion could not be completed because the supplied DateTime
did not have the Kind property set correctly. For example, when the
Kind property is DateTimeKind.Local, the source time zone must be
TimeZoneInfo.Local.

Parameter name: sourceTimeZone"}

我错过了什么?


一些东西:

  • 文本仅在转换为/从字符串转换时影响输出格式。它不会影响时区转换,因此这里没有必要。

  • 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直接转换为目标时区即可。

代码应该只是:

1
2
var tz = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
var swedishTime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tz);

或者如果您愿意,可以使用便捷方法:

1
2
var swedishTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow,
                                                                "W. Europe Standard Time")

只需从"var swedishTime"中删除"TimeZoneInfo.Local"即可。

1
2
3
4
5
6
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来修复它。

而不是这个

1
var currentDateTime = DateTime.UtcNow;

我把它说:

1
var currentDateTime = new DateTime(DateTime.UtcNow.Ticks, DateTimeKind.Unspecified);