C# 如何解决时区转换错误?

C# 如何解决时区转换错误?,c#,asp.net-mvc,datetime,timezone,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

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

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,源时区必须为 TimeZoneInfo.Local。\r\n参数名称:sourceTimeZone“}

我遗漏了什么?

只需从“var swedishTime”中删除“TimeZoneInfo.Local”

有几件事:

  • 区域性仅在转换为字符串或从字符串转换时影响输出格式。它不影响时区转换,因此在这里不需要

  • Windows上的
    TimeZoneInfo
    使用的时区标识符来自Windows操作系统本身,有时它们的名称与您可能期望的不匹配

    • 您使用的是Windows时区ID
      “中欧标准时间”
      ,其显示名称为
      “(UTC+01:00)萨拉热窝、斯科普里、华沙、萨格勒布”
    • 对于瑞典,您应该实际使用ID
      “W.Europe Standard Time”
      ,其显示名称为
      “(UTC+01:00)阿姆斯特丹、柏林、伯尔尼、罗马、斯德哥尔摩、维也纳”
    • 您可以在中标题为“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")

我也遇到了同样的问题,我通过更改为
DateTimeKind.Unspecified
解决了这个问题

而不是这个

var currentDateTime = DateTime.UtcNow;
我这样说:

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

使用正确的类型DateTimeOffset。仅使用
DateTime
无法避免转换错误,即使将其设置为
DateTimeKind.UTC
。什么地方?web应用程序、服务器还是浏览器?
var currentDateTime = new DateTime(DateTime.UtcNow.Ticks, DateTimeKind.Unspecified);