首页 > 解决方案 > dart DateTime 差异错误(28.3 到 27.3 之间)

问题描述

试试这个(在https://dartpad.dev/中):

int day = 28;
DateTime day1 = DateTime(2020, 3, day);
DateTime day2 = DateTime(2020, 3, day - 1);
print(day1.difference(day2).inDays);

结果应该是 1,取而代之的是 0...用任何其他值替换“day”变量,它会给出正确的结果 (1)...

它是一个错误吗?

标签: datetimedartdifference

解决方案


好吧,问题归结为它的返回值difference是:

差异以秒和几分之一秒为单位。上面的差异计算了这些日期开始时午夜之间的小数秒数。如果上述日期是当地时间,而不是 UTC,则由于夏令时差异,两个午夜之间的差异可能不是 24 小时的倍数。

https://api.dart.dev/stable/2.7.2/dart-core/DateTime/difference.html

所以我们从中得到的值difference是一个Duration包含两个对象之间差异的DateTime对象,以秒为单位。然后,您可以要求Duration以天为单位表示此结果。

问题是许多国家正在改变他们的时钟,因为三月份的夏令时。实际上,自从我在丹麦以来,您的示例在我的计算机上没有显示任何错误。所以我把你的代码改成:

void main() {
  for (var day = 1; day <= 31; day++) {
    DateTime day1 = DateTime(2020, 3, day);
    DateTime day2 = DateTime(2020, 3, day - 1);
    print('Day $day: inDays: ${day1.difference(day2).inDays} inHours: ${day1.difference(day2).inHours}');
  }
}

在我的计算机上返回以下内容:

Day 27: inDays: 1 inHours: 24
Day 28: inDays: 1 inHours: 24
Day 29: inDays: 1 inHours: 24
Day 30: inDays: 0 inHours: 23
Day 31: inDays: 1 inHours: 24

因为我们实际上在更改为夏令时时删除了一天中的一小时,所以返回的持续时间不是 24 小时而是 23 小时。


推荐阅读