Data i czas

Spis treści Poprzednia strona: Łańcuchy znaków Następna strona: Operatory i wyrażenia

Przechowywanie zarówno daty, jak i czasu obsługiwane jest w .NET przy pomocy jednej struktury System.DateTime. Typ ten posiada statyczną właściwość DateTime.Now, która zwraca aktualną datę i czas systemowy (z zegara komputera, na którym została uruchomiona). Możemy też uzyskać samą datę (DateTime.Today albo DateTime.Now.Date), ale sam czas (DateTime.Now.TimeOfDay) jest już innego typu: System.TimeSpan. Typ System.TimeSpan przechowuje sam czas, ale nie koniecznie od zera do 24 godzin. Zakres dla TimeSpan to jakieś 29 tysięcy lat (na plus i na minus).

Jeśli znamy datę i czas, a chcemy uzyskać zmienną typu DateTime, to tworzymy go przy pomocy konstruktora tak: DateTime d = new DateTime(rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda), przy czym wszystkie argumenty powinny być typu int. Poszczególne składniki daty i czasu można potem odczytać przy pomocy właściwości odpowiednio d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second, d.Milisecond, a także dodatkowo d.DayOfWeek (enum z dniem tygodnia, niedzieli odpowiada zero) i d.DayOfYear (numer dnia w danym roku).

Wszystko ładnie i pięknie, ale… ogólnie (czyli międzynarodowo) rzecz biorąc, to data zależy od używanego kalendarza (klasa Calendar), a czas zależy od strefy czasowej (klasa TimeZoneInfo). Najpopularniejszym kalendarzem jest kalendarz gregoriański i to jest właśnie nasz „normalny” kalendarz. Na szczęście (albo nieszczęście) w .NET jest to kalendarz domyślny. Jeśli problemy ze strefami czasowymi dotyczą naszej aplikacji, to najlepiej jest przechowywać czas według neutralnej strefy czasowej UTC (Universal Time Coordinated). Taki czas uzyskujemy przy pomocy metody ToUniversalTime() klasy DateTime. Metodą odwrotną jest ToLocalTime() i pozwala ona przeliczyć czas UTC na nasz czas lokalny (np. do wyświetlenia gdzieś w naszej aplikacji). Skąd metoda ToLocalTime() wie gdzie się znajdujemy i jaki mamy czas? Z ustawień aktualnej strefy czasowej w systemie operacyjnym.Znajdujemy się w takiej TimeZoneInfo.Local.DisplayName strefie czasowej. Dzisiaj [today] o tyle TimeZoneInfo.Local.GetUtcOffset(DateTime.Today) godzin czas lokalny jest przesunięty względem czasu UTC. Właściwość SupportsDaylightSavingTime mówi nam o tym, czy dana strefa uwzględnia DST, czyli czas letni (np. w środkowej Afryce są strefy, które takiej zmiany na czas letni nie uwzględniają). Metoda TimeZoneInfo.Local.IsDaylightSavingTime(DateTime.Now) mówi nam o tym, czy w danym dniu obowiązuje czas letni. O której godzinie i jakiego dnia następuje jaka zmiana czasu? Te informacje są zakodowane w regułach typu TimeZoneInfo.AdjustmentRule (klasa zagnieżdżona!), których tablicę zwraca metoda TimeZoneInfo.Local.GetAdjustmentRules().

Arytmetyka na datach i czasach jest dość prosta:

  • dodawanie do daty różnych okresów czasu (odejmowanie to dodawanie liczb ujemnych) realizują metody AddXXX typu DateTime: AddYears(int), AddMonths(int), AddDays(double), AddHours(double), AddMinutes(double), AddSeconds(double), AddMiliseconds(double), AddTicks(long)
  • odejmowanie dat daje w wyniku typ TimeSpan i jego właściwości mówią nam ile minęło dni (Days), godzin (Hours), minut (Minutes), sekund (Seconds) oraz milisekund (Milisecond) albo tików (Ticks), czyli dziesiątych części mikrosekundy (to najdokładniejsza jednostka czasu dostępna dla .NET-u)

Konwersja daty i czasu może odbywać się w 4 kierunkach:

  • z DateTime do String metoda d.ToString(format), gdzie format to tekstowy opis formatowania według tych samych reguł, co w metodzie String.Format()
  • z String do DateTime metoda statyczna DateTime.Parse(string) ogólna albo konkretna DateTime.ParseExact(string, format, IFormatProvider)
  • z DateTime do long (tak, zmieści się na 8 bajtach!) metoda d.ToBinary()
  • z long do DateTime metoda statyczna DateTime.FromBinary(long)

Spis treści Poprzednia strona: Łańcuchy znaków Następna strona: Operatory i wyrażenia