3 月 31 日 4 月 1 日的 Dart/Flutter 日期时间差 inDays 错误

Ben*_*min 5 dart flutter

我试图让两个日期之间的天数差从拍摄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)

Ben*_*min 8

@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)

  • 当我们最终在全球范围内消除夏令时时,我会非常高兴。这太荒谬了。 (2认同)
  • 我知道这违反了协议,但是天哪,我浪费了一整天的时间试图找出这个日期时间和夏令时是如何工作的。愿比特和字节之神保佑你@Benjamin! (2认同)

Gün*_*uer 5

不要对本地日期进行日期比较或操作。首先将其转换为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。