我试图在从DatePicker
挑选的两个日期之间获得差异。这个工作正常,除了一个日期:3月31日。
两个DateTimes
之间的天数之差在1天之后是错误的,其中一个日期是3月31日。我知道这是由于Light Saving和March是30.9 ...天长而不是31,因此我猜,错误。但除了手动检查日期是否等于3月31日并在结果中添加一天之外,是否有人知道如何解决此问题?
可以在Dart Pad中运行的两个非常简单的示例:
DateTime aprilFirst = DateTime(2019, 3, 30);
DateTime marchThirtyFirst = DateTime(2019, 3, 31);
print(aprilFirst.difference(marchThirtyFirst).inDays); => -1
DateTime marchThirty = DateTime(2019, 4, 1);
DateTime marchThirtyFirst = DateTime(2019, 3, 31);
print(marchThirty.difference(marchThirtyFirst).inDays); => 0
更新:
DateTime aprilFirst = DateTime(2019, 4, 1);
print(aprilFirst.add(Duration(days: -1))); => 2019-03-30 23:00:00.000
这应该打印2019-03-31 23:00:00.000!
我尝试了GünterZöchbauer制作DateTimes UTC的解决方案,但结果完全相同:
DateTime aprilFirst = DateTime(2019, 4, 1).toUtc();
DateTime marchThirty = DateTime(2019, 3, 30).toUtc();
DateTime marchThirtyFirst = DateTime(2019, 3, 31).toUtc();
print(aprilFirst.difference(marchThirtyFirst).inHours); => 23
print(aprilFirst.difference(marchThirtyFirst).inDays); => 0
print(marchThirty.difference(marchThirtyFirst).inHours); => -24
print(aprilFirst.add(Duration(days: -1))); => 019-03-30 22:00:00.000Z
不要与本地日期进行日期比较或操作。首先将其转换为UTC。否则,夏令时和其他与本地DateTime相关的异常将导致各种令人惊讶的影响。
DateTime aprilFirst = DateTime(2019, 3, 30).toUtc();
DateTime marchThirtyFirst = DateTime(2019, 3, 31).toUtc();
print(aprilFirst.difference(marchThirtyFirst).inDays); => -1
如果结果是DateTime
,你可以使用xxx.toLocal()
将其转换回来
还有一个构造函数允许创建UTC DateTime
而不是创建本地DateTime
然后转换为UTC。
@GünterZöchbauer让我走上了正确的道路。 DateTime(...).toUTC()
将无法进行差异计算。但是,使用DateTime.utc(...)
构造函数就可以了!
DateTime aprilFirst = DateTime.utc(2019, 4, 1);
DateTime marchThirty = DateTime.utc(2019, 3, 30);
DateTime marchThirtyFirst = DateTime.utc(2019, 3, 31);
print(aprilFirst.difference(marchThirtyFirst).inHours); => 24
print(aprilFirst.difference(marchThirtyFirst).inDays); => 1
print(marchThirty.difference(marchThirtyFirst).inHours); => -24
print(aprilFirst.add(Duration(days: -1))); => 2019-03-31 00:00:00.000Z