MC, 13:40 sobota, 13.04.2013 r.
Ilustracja do artykułu: C# - Konwersja pomiędzy DateTime a czasem uniksowym (timestamp, czas POSIX)

C# - Konwersja pomiędzy DateTime a czasem uniksowym (timestamp, czas POSIX)

W tym artykule chciałbym umieścić implementację dwóch prostych metod pozwalających na obsługę czasu uniksowego (unix timestamp, unix time, czas POSIX).

Czym jest czas uniksowy?

Nie wdając się w szczegóły jest to liczba sekund, która upłynęła od pierwszego stycznia 1970 roku (czas UTC). Jest to bardzo popularny format przechowywania znaczników czasowych pewnych zdarzeń, operacji i tak dalej. Z tego powodu warto wiedzieć jak sobie poradzić z czasem uniksowym w Microsoftowych frameworkach opartych na języku C#, w których mamy do czynienia z obiektem DateTime. Nie ma on w swojej domyślnej implementacji żadnych metod pozwalających na konwersję czasu POSIX na obiekt DateTime, czy konwersję odwrotną. Dlatego warto wiedzieć jak najprościej poradzić sobie z tym zagadnieniem na własną rękę.

Jak konwertować między sobą czas uniksowy i obiekty DateTime?

Najpierw spróbujmy pozyskać z czasu uniksowego stosowny obiekt DateTime, odpowiadający danemu znacznikowi czasowemu. Spójrzmy na poniższą przykładową implementację takiej funkcji:
public DateTime UnixTimeToDateTime(long timeStamp)
{
DateTime unixEpochDateTime = new DateTime(1970,1,1,0,0,0,0, DateTimeKind.Utc);
return unixEpochDateTime.AddSeconds(timeStamp).ToLocalTime();
}
Jak widać nic skomplikowanego. Przyjmujemy jako argument, czas uniksowy (timeStamp), następnie tworzymy obiekt odpowiadający początkowi epoki uniksa i dodajemy do niego nasz argument. Tak powstały obiekt DateTime zwracamy.

Podobnie rzecz się będzie miała w przypadku konwersji odwrotnej. Tym razem jednak wyliczymy różnicę pomiędzy przekazaną datą, a początkiem epoki uniksa.

public long DateTimeToUnixTime(DateTime date)
{
DateTime unixEpochDateTime = new DateTime(1970,1,1,0,0,0,0, DateTimeKind.Utc);
TimeSpan difference = date - unixEpochDateTime;
return (long)difference.TotalSeconds;
}

Komentarze (0) - Nikt jeszcze nie komentował - bądź pierwszy!

Imię:
Treść: