Сегодня мы кое-что узнали. Сначала я хотел обвинить команду Google Dart, потому что очевидно, что я не делаю ошибок!

Наш вариант использования был прост — вычислить разницу в днях между двумя датами. Как трудно это может быть? Дарт поставляется с удобным API:

Рассчитаем разницу между первым января и апрельского дурака:

DateTime d1 = DateTime(2020, 1, 8);
DateTime d2 = DateTime(2020, 4, 8);
 
print(d1);
print(d2);
 
print(d2.difference(d1).inDays);

91 - это простой ответ, верно? Нет — мой кодовый блок Dart ответил:

2020-01-08 00:00:00.000 
2020-04-08 00:00:00.000 
90

После первоначального шока у нас было 2 предположения — либо Dart не может работать с високосными годами, либо с переходом на летнее время. Или может, но источник ошибки где-то между монитором и креслом программиста?

При расчете разницы во времени вы хотите знать как о високосных годах, так и о сдвигах во времени, поэтому естественным ответом будет UTC — универсальные часы времени — часы, которые не заботятся о сдвигах во времени.

Но будьте осторожны при реализации идеи utc. Этот код правильный?

DateTime d1 = DateTime(2020, 1, 8).toUtc();
DateTime d2 = DateTime(2020, 4, 8).toUtc();
  
print(d1);
print(d2);
  
print(d2.difference(d1).inDays);

Нет — простое использование toUtc() не поможет вам в расчетах, ошибка сдвига во времени все еще здесь!

Вот правильный ответ — именованный конструктор utc:

DateTime d1 = DateTime.utc(2020, 1, 8);
DateTime d2 = DateTime.utc(2020, 4, 8);
  
print(d1);
print(d2);
  
print(d2.difference(d1).inDays);

И рассчитанный ответ, наконец, правильный:

2020-01-08 00:00:00.000Z 
2020-04-08 00:00:00.000Z 
91

В общем, при расчете времени забудьте о местном времени — убедитесь, что вы используете UTC с правильным конструктором.