【问题标题】:Dart/Flutter Not recognizing yesterday because of daylight savings timeDart/Flutter 由于夏令时无法识别昨天
【发布时间】:2020-03-01 00:48:33
【问题描述】:

我有一个应用程序,用户可以在其中跟踪他们的连续记录。由于夏时制的处理方式,今天的条纹正在打破。日期以“MM/dd/yyyy”格式的字符串存储在 Firebase 数据库中。因此,对于在 2019 年 11 月 3 日星期日使用该应用程序的用户,字符串值为“11/03/2019”,它转换为打印的日期值

2019-11-03 00:00:00.000

以下是我如何从当前日期减去小时/分钟,以便将其与其他日期进行比较:

final dateFormat = intl.DateFormat('MM/dd/yyyy');
final todayString = dateFormat.format(DateTime.now());
final today = dateFormat.parse(todayString);
print('Today is ' + today.toString());

当我打印今天的值时,我得到:

2019-11-04 00:00:00.000

当我尝试像这样获取昨天的 DateTime 值时:

 today.subtract(Duration(days: 1))

值打印如下:

2019-11-03 01:00:00.000

请注意,小时值现在有一个。

决定是否打破或继续连胜。我正在使用 DateTime.compareTo() 函数将用户的最后使用日期与昨天进行比较。

final activeStreak = this.lastTraining.compareTo(today.subtract(Duration(days: 1)));

对于在 2019 年 11 月 3 日星期日使用该应用的用户,该值应返回为 0,因为昨天应该等于昨天。但是由于夏令时,现在昨天被视为昨天,所以它返回一个值 -1。

如何在接下来的几年中防止此错误?

【问题讨论】:

    标签: datetime flutter dart dst


    【解决方案1】:

    我可以建议使用 DateTime.utc() 构造函数创建 DateTime 对象,它可以防止夏令时问题。比较这两个例子:

    void main() {
      //Example 1: Without UTC
      DateTime yesterday = DateTime(2019, 11, 3);
      DateTime today = DateTime(2019, 11, 4);
      DateTime now = DateTime.now();
      print(yesterday);                             // 2019-11-03 00:00:00.000
      print(today.subtract(Duration(days: 1)));     // 2019-11-03 01:00:00.000
      print(yesterday.compareTo(today.subtract(Duration(days: 1)))); // -1
      print(today.compareTo(now));
    
      print("");
    
      //Example 2: With UTC constructor
      DateTime yesterdayUtc = DateTime.utc(2019, 11, 3);
      DateTime todayUtc = DateTime.utc(2019, 11, 4);
      DateTime nowUtc = DateTime.now().toUtc();
      print(yesterdayUtc);                           // 2019-11-03 00:00:00.000Z
      print(todayUtc.subtract(Duration(days: 1)));   // 2019-11-03 00:00:00.000Z
      print(yesterdayUtc.compareTo(todayUtc.subtract(Duration(days: 1)))); // 0
      print(today.compareTo(nowUtc));
    }
    

    DartPad 链接:https://dartpad.dartlang.org/c4244a97890798373ee053f04032ccad

    在处理日期或历史事件时,更喜欢使用 UTC 日期时间,因为它们不受夏令时变化的影响,也不受当地时区的影响。

    来源: https://api.dartlang.org/stable/2.6.0/dart-core/DateTime/DateTime.utc.html

    【讨论】:

    • 使用DateFormat.parseUtc() 将字符串解析为UTC日期。
    • 完美!!谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2021-02-15
    • 2014-11-03
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多