我正在尝试使用以下代码转换为瑞典语时区:
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"}
我缺少什么?
答案 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操作系统本身,有时它们的名称与您的预期不符。
"Central European Standard Time"
,其显示名称为"(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb"
。"W. Europe Standard Time"
,其显示名称为"(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna"
由于您正在查找特定时区的当前时间,因此您根本不应该浏览本地时区。只需将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);