【问题标题】:Compare DateTimeOffset with daylight saving time将 DateTimeOffset 与夏令时进行比较
【发布时间】:2021-09-24 01:52:49
【问题描述】:

这里的 DateTimeOffset 实例代表相同的时间,但一个实例有 DST 而另一个没有。 我想比较没有 DST 的实例,所以结果是 True。

using System;

var today = DateTime.Today;

// Today YYYY-MM-01
var firstDayMonth = new DateTimeOffset(
    new DateTime(today.Year, today.Month, 1, 0, 0, 0, today.Kind).AddHours(12));

// Add year offset from 2000
DateTimeOffset withYearOffset = firstDayMonth.AddYears(2000 - firstDayMonth.Year);

// Add month offset from 1
var withMonthOffset = withYearOffset.AddMonths(1 - withYearOffset.Month);

// Add day offset from 1
var calculated_dt_2000_1_1_12_0_0 = withMonthOffset.AddDays(1 - withMonthOffset.Day);

// 01.01.2000 12:00:00 +03:00
Console.WriteLine(calculated_dt_2000_1_1_12_0_0);

var dt_2000_1_1_12_0_0 = new DateTimeOffset(new DateTime(2000, 1, 1).AddHours(12));

// 01.01.2000 12:00:00 + 02:00
Console.WriteLine(dt_2000_1_1_12_0_0);

// False
Console.WriteLine(calculated_dt_2000_1_1_12_0_0.Equals(dt_2000_1_1_12_0_0));

【问题讨论】:

  • 你可能需要用TimeZoneInfo做点什么。
  • “一个实例有 DST 而另一个没有” - 但它比只是 DST 差异更明显。您已经计算了 DST 生效的中午,并且您还计算了 DST 无效的中午。从字面上看,那些时间不是同一时间

标签: c# datetime datetimeoffset


【解决方案1】:

转换为 UTC 可以解决问题。

var calculated_dt_2000_1_1_12_0_0 = withMonthOffset.ToUniversalTime().AddHours(firstDayMonth.Offset.Hours);


var dt_2000_1_1_12_0_0_withOffset = new DateTimeOffset(new DateTime(2000, 1, 1).AddHours(12));
var dt_2000_1_1_12_0_0 = dt_2000_1_1_12_0_0_withOffset.ToUniversalTime().AddHours(dt_2000_1_1_12_0_0_withOffset.Offset.Hours);

【讨论】:

  • 嗯,它移动问题。您已经用 DST 表达了这个问题 - 但是您是否希望两个代表同一时间但在世界相反两侧的值(例如,一个是早上 6 点,一个是下午 6 点)进行比较?我们不知道您在这里实际尝试模拟什么情况,因此很难说这种方法是否合适。
  • 你好。我很高兴感谢您的帮助。我同意这不一样。它是来自单元测试的代码,它只是验证添加一天的效果很好。
猜你喜欢
  • 2013-07-21
  • 2021-12-24
  • 2012-02-12
  • 1970-01-01
  • 2011-10-09
  • 2011-12-16
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
相关资源
最近更新 更多