Dart / Flutter由于夏令时而无法识别昨天

我有一个可以跟踪用户条纹的应用程序。由于处理夏时制的方式,今天的条纹开始中断。日期以字符串“ 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。

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

super__1987cl 回答:Dart / Flutter由于夏令时而无法识别昨天

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

void main() {
  //Example 1: Without UTC
  DateTime yesterday = DateTime(2019,11,3);
  DateTime today = DateTime(2019,4);
  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("");

  //Example 2: With UTC constructor
  DateTime yesterdayUtc = DateTime.utc(2019,3);
  DateTime todayUtc = DateTime.utc(2019,4);
  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
}

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

  

在处理日期或历史事件时,最好使用UTC日期时间,因为它们不受夏时制更改的影响,也不受本地时区的影响。

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

本文链接:https://www.f2er.com/3165064.html

大家都在问