如何在Dart中获取昨晚的午夜时间?

34

我想在大多数编程语言中这应该是一项相当普遍的任务,但对于我在Flutter应用程序中如何完成此操作并不清楚。如何在Dart中检索上一个午夜的DateTime对象?或者可能是今天/明天/昨天的任何特定时间?

3个回答

85

这应该是相同的

var now = DateTime.now();
var lastMidnight = DateTime(now.year, now.month, now.day);
您可以使用此方法获取当天的不同时间。
var tomorrowNoon = DateTime(now.year, now.month, now.day + 1, 12);

var yesterdaySixThirty = DateTime(now.year, now.month, now.day - 1, 6, 30);

根据您的需求,绝对值可能更安全,因为添加/减去 Duration 可能会因闰年和夏令时而导致意外情况。


5

尝试使用 Jiffy 包,它使用了 momentjs 语法的简洁性。请参见下文

获取昨天午夜时间

var lastMidnight = Jiffy.now().subtract(days: 1).startOf(Unit.day);

print(lastMidnight.dateTime); // 2019-10-20 00:00:00.000
//or you can also format it
print(lastMidnight.yMMMMEEEEdjm); // Sunday, October 20, 2019 12:00 AM

1

编辑:仅在使用协调世界时(夏令时可能会出现问题)时使用此解决方案,或者无论如何都可以使用已接受的答案。


迄今为止我找到的最简单的解决方案是:
final now = DateTime.now();
final lastMidnight = now.subtract(Duration(
  hours: now.hour,
  minutes: now.minute,
  seconds: now.second,
  milliseconds: now.millisecond,
  microseconds: now.microsecond,
));

我们可以通过减去或添加持续时间来获得相对于今天的任何其他时间或日期,例如:

final tomorrowNoon = lastMidnight.add(Duration(days: 1, hours: 12));
final yesterdaySixThirty = lastMidnight
    .subtract(Duration(days: 1))
    .add(Duration(hours: 6, minutes: 30));

请注意,DateTime是不可变的,add和subtract方法都返回一个新对象。

2
这个解决方案可能无法在夏令时更改期间准确到达午夜。当我们切换到夏令时时,自午夜以来已经过去了14个小时,例如下午1点。如果您使用UTC日期,则此代码确实有效,因为UTC中没有夏令时。 - lrn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接