3月31日/4月1日的省道/颤动日期时差天数误差 [英] Dart/Flutter DateTime difference inDays error for March 31 April 1

查看:7
本文介绍了3月31日/4月1日的省道/颤动日期时差天数误差的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试获取从DatePicker中选取的两个日期之间的天数差。除一个日期:3月31日外,其他日期运行正常。

当其中一个日期是3月31日时,两个DateTimes之间的天数相差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

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ü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

推荐答案

@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

这篇关于3月31日/4月1日的省道/颤动日期时差天数误差的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆