Дротик / флаттер Не узнал вчера из-за летнего времени - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть приложение, в котором пользователи отслеживают свои серии. Полосы сегодня ломаются из-за подхода к летнему времени. Даты хранятся в базе данных Firebase в виде строки в формате «MM / dd / yyyy». Так что для пользователя, который использовал приложение в воскресенье, 3 ноября 2019 года, строковое значение «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)));

Для пользователя, который использовал приложение в воскресенье, 3 ноября 2019 года, значение должно вернутьсякак 0, потому что вчера должно равняться вчера. Но из-за перехода на летнее время вчерашний день обрабатывается так же, как и вчера, поэтому он возвращает значение -1. ​​

Как я могу предотвратить эту ошибку в последующие годы?

1 Ответ

1 голос
/ 05 ноября 2019

Могу ли я предложить создание объектов DateTime с помощью конструктора DateTime.utc (), это предотвратит проблемы перехода на летнее время. Сравните эти два примера:

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

...