我有一个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
}
该框架将遵循夏令时规则。在您的示例中:
- 输入
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
是正确的2.
1 国家/地区或分区定义其时区,其中包括一个或多个偏移量以及这些偏移量生效的日期。
2 如果输入日期在 DST 之外,则相同的代码将产生一小时的差异。
避免使用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));
您可能没有考虑夏令时。
bool isDST = time.IsDaylightSavingTime;
以检查 DST 是否在特定日期生效。