我有一个UTC输入时间,想要将其转换为设备的本地时间。我想使用TryParse方法来避免异常。
输入时间是晚上7点。预期的out DateTime date
参数是20:00。相反,它变成了21:00。
我的时区是GMT + 1欧洲中部时间。它目前不是DST,但是DST在今年3月晚些时候开始。
var value = "4/2/2018 7:00:00 PM"; // UTC time
if (DateTime.TryParse(value.ToString(), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out DateTime date))
{
var isDST = date.IsDaylightSavingTime(); // true
var kind = date.Kind; // DateTimeKind.Local
var time = date.ToShortTimeString(); // 21:00
}
答案 0 :(得分:0)
你可能没有考虑夏令时。
bool isDST = time.IsDaylightSavingTime;
检查DST是否对特定日期有效。
答案 1 :(得分:0)
避免使用Local
日期时间类型,因为这意味着您的代码将以不同的方式运行,具体取决于正在运行的计算机的时区。
您需要确保在UTC中有一个有效的日期时间表示,然后明确转换为您需要的时区:
var utcDateTime = DateTime.SpecifyKind(DateTime.Parse(val), DateTimeKind.Utc); // guarantee your DateTime is in Utc.
TimeZoneInfo localZone = TimeZoneInfo.FindSystemTimeZoneById("E. Europe Standard Time");
Console.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, localZone));
答案 2 :(得分:0)
该框架将遵守夏令时规则。在您的示例中:
April 2, 2018 7:00 PM UTC
Central European Time (CET)
显然,您的国家 1 计划在3月的最后一个星期日使用Central European Summer Time (CEST)
,时区偏移会将+01:00
更改为+02:00
。结果April 2, 2018 9:00 PM
is therefore correct 2 。
1 国家或分区定义其时区,其中包括一个或多个偏移量以及这些偏移量生效的日期。
2 如果输入日期在DST之外,相同的代码将产生一小时的差异。