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上的
使用的时区标识符来自Windows操作系统本身,有时它们的名称与您可能期望的不匹配TimeZoneInfo
- 您使用的是Windows时区ID
,其显示名称为“中欧标准时间”
“(UTC+01:00)萨拉热窝、斯科普里、华沙、萨格勒布”
- 对于瑞典,您应该实际使用ID
,其显示名称为“W.Europe Standard Time”
“(UTC+01:00)阿姆斯特丹、柏林、伯尔尼、罗马、斯德哥尔摩、维也纳”
- 您可以在中标题为“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")
我也遇到了同样的问题,我通过更改为
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);