日期时间转换两次不等于开始时间

Datetime Converting two times not equal starting time

我正在使用 TimeZoneConverter NuGet 包。

太平洋标准时间使用 UTC-8

  1. 创建了太平洋时区的日期时间。
  2. 太平洋时间转换成utc时间。
  3. UTC 时间再次转换为太平洋时区。但结果不等于第一项中的日期时间。为什么?有什么想法吗?
[Fact]
public void DateTimeConvertTesting()
{
    TimeZoneInfo pacificTimeZone = TZConvert.GetTimeZoneInfo("Pacific Standard Time"); // TimeZoneConverter
    DateTimeOffset dateTimeOffsetPacific2 = new DateTimeOffset(2021, 09, 01, 11, 59, 0, pacificTimeZone.BaseUtcOffset);
    DateTime utcDateTime = dateTimeOffsetPacific2.UtcDateTime;
    DateTime pacificTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, pacificTimeZone);
    Assert.True(dateTimeOffsetPacific2.DateTime == pacificTime);
}

我认为 Caius Jard 在评论中提出了正确的问题。

看起来像 Pacific Standard Time on 2021, DST started March 14 02:00 AM and ends 7 November 02:00 AM

TimeZoneInfo.ConvertTimeFromUtc method 处理夏令时 本身 。这意味着,如果 DatetimeDateTimeOffsetPacific Standard Time 的 DST,它 returns DST 附加值(通常为 1 小时)。这就是为什么你的 pacificTime 变量 会是{9/1/2021 12:59:00 PM}不是{9/1/2021 11:59:00 PM}

如果您必须使用 ConvertTimeFromUtc 进行测试,最好先检查您的 DateTimeDateTimeOffset 是否为 [=35= 的夏令时]that 特定时区。您可以使用 TimeZoneInfo.IsDaylightSavingTime 方法来重载 DateTimeDateTimeOffset.

var isDaylightSavingTime = pacificTimeZone.IsDaylightSavingTime(utcDateTime);
// for 2021, 09, 01, 11, 59, 0, this returns true.