如何解决时区转换错误?

时间:2016-06-23 09:08:47

标签: c# asp.net-mvc datetime timezone

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

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);

出于某种原因,我得到了:

  

{"由于提供的DateTime,无法完成转换   没有正确设置Kind属性。例如,当   Kind属性是DateTimeKind.Local,源时区必须是   TimeZoneInfo.Local。\ r \ nParameter name:sourceTimeZone"}

我缺少什么?

3 个答案:

答案 0 :(得分:2)

只需删除" TimeZoneInfo.Local"来自" var swedishTime"。

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);

答案 1 :(得分:2)

一些事情:

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

  • Windows上TimeZoneInfo使用的时区标识符来自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"
    • 您可以在the timezone tag 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")

答案 2 :(得分:0)

我遇到了同样的问题,并通过更改为DateTimeKind.Unspecified来解决。

代替这个

var currentDateTime = DateTime.UtcNow;

我把这个:

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