DateTimeOffset zamiast DateTime

W poprzednim wpisie Czas UTC a DateTime.Kind byłem zbyt mało stanowczy lub nie wyczerpałem tematu 😉 Maciek w komentarzu podzielił się linkiem i skomentował krótko – DateTime.Now praktycznie nigdy nie ma sensu

Autor podlikowanego posta (The case against DateTime.Now) proponuje aby DateTime.Now i DateTimeKind.Local zostały w następnej wersji .NET oznaczone jako [Obsolete]. Postaram się streścić ten artykuł.

Typy DateTimeKind:

  • DateTimeKind.Utc – jest dobry, wiemy o jaki konkretny punkt w czasie.
  • DateTimeKind.Unspecified – jakkolwiek nazwa wydaje się, że bezużyteczny – całkiem daje radę. Oznacza punkt w jakimś kalendarzu, nie wiem jeszcze jaki to kalendarz, ale czasem tyle nam wystarczy.
  • DateTimeKind.Local – oznacza czas lokalny na maszynie na której jesteśmy. Niestety tak szybko jak opuści tą maszynę staje się bezużyteczny i zamienia się w Unspecified. Niestety odczytując datę z bazy, nie wiemy już kto to zapisał i co miał na myśli (jakiego kelandarza użył).

Esencja

Jeśli pobieramy aktualny czas systemowy, wartości takie jak 2013-04-25 9:26 AM są użyteczne tylko do pokazywania w UI. To czego naprawdę chcemy to 2013-04-25 9:26 AM -0700. W ten sposób dane podczas przechowywania i transportu nie gubią kontekstu. To da się zrobić korzystając z DateTimeOffset.Now, więc nie ma powodu aby używać DateTime.Now. Jeśli nie chcemy pokazywać offsetu w UI to nie musimy. A możemy łatwo (i domyślenie) użyć DateTimeOffset w miejscach gdzie użylibyśmy DateTime (Implicit Conversion).

// Get the computer's local time
DateTimeOffset dto1 = DateTimeOffset.Now;
 
// Get the computer's time in UTC
DateTimeOffset dto2 = DateTimeOffset.UtcNow;

Każda z tych wartości będzie dokładnie representować ten sam punkt w czasie.

Update

Nawet jak zastowujemy sie do wszystko dobrych praktyk to problemy i tak beda. To co próbujemy modelować jest bardzo trudne i nie ma dobrych rozwiazań. Ktoś zawsze będzie chciał mieć inaczej podane dane. Na przykład w GitHubie jest timeline, pokazujący, ile w kolejnych dniach commitowaliśmy. Ale co tak naprawdę mówi czy dany commit poszedł 31 grudnia czy już 1 stycznia:

  • UTC?
  • strefa ustawiona w moich ustawieniach (mogę przecież zmienić – co wtedy)?
  • moja aktualna strefa (to chyba nic nie powie, mogę przecież iść przez USA)?

A mówimy tylko o toolu w którym to tak naprawdę nie ma znaczenia.

Reklamy
Ten wpis został opublikowany w kategorii Programowanie i oznaczony tagami , , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

Jedna odpowiedź na „DateTimeOffset zamiast DateTime

  1. Pingback: dotnetomaniak.pl

Możliwość komentowania jest wyłączona.