Próbuję przekonwertować zmienną DateTime języka C # na czas uniksowy, tj. Liczbę sekund od 1 stycznia 1970 r. Wygląda na to, że DateTime jest faktycznie zaimplementowany jako liczba „taktów” od 1 stycznia 0001.
Obecnie myślę o odjęciu 1 stycznia 1970 od daty i godziny w następujący sposób:
TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;
Czy jest lepszy sposób?
Odpowiedzi:
W zasadzie to wszystko. Oto metody, których używam do konwersji do i z czasu uniksowego:
Aktualizacja: Począwszy od .Net Core 2.1 i .Net Standard 2.1, data i godzina równa uniksowej epoce można uzyskać ze statycznego
DateTime.UnixEpoch
.źródło
t specify this explicitly and somewhere later in code you
będziesz mieć ToUniversalTime (), wtedy skończy się zły czas w Utc, ponieważ domyślnie DateTime NIE jest Utc.Jeśli reszta twojego systemu jest w porządku z DateTimeOffset zamiast DateTime, istnieje naprawdę wygodna funkcja:
źródło
var time = DateTimeOffset.FromUnixTimeSeconds(5000);
MS DocJedyne, co widzę, to to, że miało to być od północy 1 stycznia 1970 UTC
źródło
Prawdopodobnie chcesz użyć DateTime.UtcNow, aby uniknąć problemu ze strefą czasową
źródło
Takie podejście będzie dobre, jeśli dana data jest w czasie UTC lub reprezentuje czas lokalny w obszarze, w którym nigdy nie obserwowano czasu letniego. Procedury różnicowe DateTime nie biorą pod uwagę czasu letniego, w związku z czym będą traktować północ 1 czerwca jako wielokrotność 24 godzin po północy 1 stycznia. Nie znam niczego w systemie Windows, który zgłasza historyczne reguły czasu letniego dla bieżącego locale, więc nie sądzę, aby można było poprawnie obsłużyć czas przed ostatnią zmianą reguły czasu letniego.
źródło
Możesz utworzyć startTime i endTime DateTime, a następnie wykonaj endTime.Subtract (startTime). Następnie podaj wartość span.Seconds.
Myślę, że to powinno działać.
źródło
Używam roku 2000 zamiast czasu epoki w moim rachunku różniczkowym. Praca z mniejszymi liczbami jest łatwa do przechowywania i transportu oraz jest przyjazna dla formatu JSON.
Sekundy od 2000 roku :
Sekundy od czasu uniksowego:
Na przykład rok 2020 to:
var year2020 = (new DateTime ()). AddYears (2019) .Ticks; // Ponieważ DateTime zaczyna się już w roku 1
637134336000000000 Kleszcze od 1 stycznia 0001
63713433600 Sekundy od 1 stycznia 0001
1577836800 sekund od czasu epoki
631152000 sekund od 2000 roku
Bibliografia:
Konwerter czasu epoki: https://www.epochconverter.com
Konwerter roku 1: https://www.epochconverter.com/seconds-days-since-y0
źródło