DateTime转换增加了一个小时

时间:2018-03-19 09:29:31

标签: c# date datetime timezone

我有一个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
}

3 个答案:

答案 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之外,相同的代码将产生一小时的差异。