检查日期(日期时间)是否为未知区域的夏令时 - c#

Check a date (datetime) if it is Daylight Saving Time with unknown region - c#

根据我从其他问题中了解到的情况,我使用以下代码检查日期是否为夏令时并根据需要进行更改。我不知道该应用程序将使用哪个区域,因此我使用的是 Utc。但是它没有按预期工作。

DateTime dateValWithOffset = dateVal;
TimeZoneInfo timeZoneInfo = TimeZoneInfo.Utc;

if(timeZoneInfo.IsDaylightSavingTime(dateValWithOffset))
{
 dateValWithOffset = dateValWithOffset.AddMinutes(60);
}

示例:对于 示例日期 (06-JUL-21 06.16.34.547000000 AM) 上面的代码应将 dateValWithOffset 显示为 07/06/2021 02:16:34.547 AM 但它 returns 07/06/2021 01:16:34.547 AM 。如果有人能指出我哪里错了请。

正如 jason.kaisersmith 在评论中所说,“UTC 是通用的,因此没有夏令时。”

详细说明一下,UTC 没有任何夏令时。相反,世界各地的每个时区都以不同方式观察夏令时。有些时区根本不使用它。某些时区在与其他时区不同的日期或时间开始和停止夏令时。甚至 one time zone 将夏令时调整 30 分钟,而不是通常的 1 小时。没有时区参考,DST 的概念就没有意义。

为了清晰和参考,2022 年 here's an overview of anticipated DST dates for 2022 by country, and a detailed list of dates and times for the first half and second half

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)

恕我直言 DateTime 是一种可怕的类型,在云计算时代之前设计。 Utc 以外的所有 DateTimeKind 值都会鼓励程序员继续错误地处理日期,应该弃用。