根据我从其他问题中了解到的内容,我使用以下代码检查日期是否为夏令时,并根据需要进行更改。我不知道应用程序将使用哪个区域,因此我使用的是Utc。然而,它并没有像预期的那样发挥作用。
DateTime dateValWithOffset = dateVal;
TimeZoneInfo timeZoneInfo = TimeZoneInfo.Utc;
if(timeZoneInfo.IsDaylightSavingTime(dateValWithOffset))
{
dateValWithOffset = dateValWithOffset.AddMinutes(60);
}
示例:对于样本日期(06JUL-21 06.16.34.547000000 AM(,上述代码应将dateValWithOffset显示为07/06/2021 02:16:34.547 AM但返回06/06/2021 01:16:34.547 AM。如果有人能指出我哪里错了,请。
Datetime
值应始终为UTC。要在机器或用户的本地时区中格式化日期时间,应转换为DateTimeOffset
。知道当地时间和知道该时间是否在夏令时是两回事。
// machine local
var timeZoneInfo = TimeZoneInfo.Local;
// or by name
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(name);
var localTime = new DateTimeOffset(dateVal, timeZoneInfo.GetUtcOffset(dateVal));
var isDst = timeZoneInfo.IsDaylightSavingTime(localTime)
IMHODateTime
是一种糟糕的类型,设计于云计算时代之前。除Utc
之外的所有DateTimeKind
值都鼓励程序员继续错误地处理日期,因此应予以弃用。
jason.kaisersmith
在评论中所说;UTC是通用的,所以没有夏令时"
详细说明一下,UTC没有夏令时。相反,夏令时在世界各地的每个时区都有不同的观测方式。有些时区根本不使用它。某些时区开始和停止夏令时的日期或时间与其他时区不同。甚至有一个时区的夏令时从通常的1小时改为30分钟。如果没有时区参考,夏令时的概念就毫无意义。
为了清晰和参考,以下是2022年按国家划分的预计夏令时日期概述,以及2022年上半年和下半年的详细日期和时间列表。