我试图让两个日期之间的天数差从拍摄DatePicker
。除了一个单一的日期:3 月 31 日,这工作正常。
DateTimes
当其中一个日期是 3 月 31 日时,两者之间的天数差1 天是错误的。我知道这是由于光节约造成的,而 3 月是 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
Run Code Online (Sandbox Code Playgroud)
DateTime marchThirty = DateTime(2019, 4, 1);
DateTime marchThirtyFirst = DateTime(2019, 3, 31);
print(marchThirty.difference(marchThirtyFirst).inDays); => 0
Run Code Online (Sandbox Code Playgroud)
更新:
DateTime aprilFirst = DateTime(2019, 4, 1);
print(aprilFirst.add(Duration(days: -1))); => 2019-03-30 23:00:00.000
Run Code Online (Sandbox Code Playgroud)
这应该打印 2019-03-31 23:00:00.000 !
我尝试了 Günter Zö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
Run Code Online (Sandbox Code Playgroud)
@Günter Zö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
Run Code Online (Sandbox Code Playgroud)
不要对本地日期进行日期比较或操作。首先将其转换为UTC。否则夏令时和其他本地 DateTime 相关的异常会导致各种令人惊讶的效果。
DateTime aprilFirst = DateTime(2019, 3, 30).toUtc();
DateTime marchThirtyFirst = DateTime(2019, 3, 31).toUtc();
print(aprilFirst.difference(marchThirtyFirst).inDays); => -1
Run Code Online (Sandbox Code Playgroud)
如果结果是 aDateTime
你可以使用xxx.toLocal()
还有一个构造函数允许创建一个 UTCDateTime
而不是创建一个本地DateTime
然后转换为 UTC。