Днес научихме нещо. Първоначално исках да обвиня екипа на 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 с подходящ конструктор.