4月31日4月1日Dart / Flutter DateTime差异天数误差

问题描述 投票:1回答:2

我试图在从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
dart flutter
2个回答
2
投票

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


2
投票

@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
© www.soinside.com 2019 - 2024. All rights reserved.