Сегодня мы кое-что узнали. Сначала я хотел обвинить команду 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 с правильным конструктором.