接受的答案是错误的。不要使用它。
这是正确的:
int daysBetween(DateTime from, DateTime to) {
from = DateTime(from.year, from.month, from.day);
to = DateTime(to.year, to.month, to.day);
return (to.difference(from).inHours / 24).round();
}
测试:
DateTime date1 = DateTime.parse("2020-01-09 23:00:00.299871");
DateTime date2 = DateTime.parse("2020-01-10 00:00:00.299871");
expect(daysBetween(date1, date2), 1); // Works!
解释为什么接受的答案是错误的:
运行这个:
int daysBetween_wrong1(DateTime date1, DateTime date2) {
return date1.difference(date2).inDays;
}
DateTime date1 = DateTime.parse("2020-01-09 23:00:00.299871");
DateTime date2 = DateTime.parse("2020-01-10 00:00:00.299871");
// Should return 1, but returns 0.
expect(daysBetween_wrong1(date1, date2), 0);
注意:由于夏令时,您可以在某一天和第二天之间有 23 小时的差异,即使您标准化为 0:00。这就是为什么以下内容也不正确的原因:
// Fails, for example, when date2 was moved 1 hour before because of daylight savings.
int daysBetween_wrong2(DateTime date1, DateTime date2) {
from = DateTime(date1.year, date1.month, date1.day);
to = DateTime(date2.year, date2.month, date2.day);
return date2.difference(date1).inDays;
}
咆哮:如果你问我,Dart DateTime 非常糟糕。它至少应该有基本的东西,比如daysBetween 以及时区处理等。
更新:包https://pub.dev/packages/time_machine声称是Noda Time的一个端口。如果是这种情况,并且它被正确移植(我还没有测试过),那么这就是你应该使用的 Date/Time 包。