Днес научихме нещо. Първоначално исках да обвиня екипа на Google Dart, защото очевидно не правя грешки!
Нашият случай на използване беше прост — изчислете разликата в дните между 2 дати. Колко трудно може да бъде? 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 с подходящ конструктор.