Rozejrzałem się po przepełnieniu stosu, a nawet spojrzałem na niektóre sugerowane pytania i żadne z nich nie wydaje się odpowiadać, jak uzyskać uniksowy znacznik czasu w C #?
c#
timestamp
unix-timestamp
bizzehdee
źródło
źródło
Odpowiedzi:
Otrzymasz uniksowy znacznik czasu w języku C #, używając
DateTime.UtcNow
i odejmując czas epoki 1970-01-01.na przykład
DateTime.UtcNow
można zastąpić dowolnymDateTime
obiektem, dla którego chcesz uzyskać znacznik czasu unix.Istnieje również pole,
DateTime.UnixEpoch
które jest bardzo słabo udokumentowane przez MSFT, ale może być zamiennikiemnew DateTime(1970, 1, 1)
źródło
DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).Ticks / TimeSpan.TicksPerSecond;
Od wersji .NET 4.6 istnieje
DateTimeOffset.ToUnixTimeSeconds()
.Jest to metoda instancji, dlatego należy wywoływać ją w instancji
DateTimeOffset
. Możesz także rzucić dowolną instancjęDateTime
, choć strzeż się strefy czasowej .Aby uzyskać bieżący znacznik czasu:
Aby uzyskać znacznik czasu z
DateTime
:źródło
Int64
- do czasu, gdy się przewróci, nie będziemy już korzystać z ziemskich lat z powodu braku Ziemi.DateTimeOffset.Now.ToUnixTimeSeconds()
Możesz także użyć Kleszczy. Piszę dla Windows Mobile, więc nie mam pełnego zestawu metod. TotalSeconds nie jest dla mnie dostępny.
lub
źródło
new DateTime(1970, 1, 1)
tworzy czas z nieokreślonąKind
właściwością. To, co naprawdę chcesznew DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
być naprawdę poprawneOto, czego używam:
Należy pamiętać, że ta metoda zwróci czas jako skoordynowany czas uniwersalny (UTC).
źródło
double
typ; rzutowanie na długi spowoduje utratę precyzji.)Obcinanie
.TotalSeconds
jest ważne, ponieważ jest zdefiniowane jakothe value of the current System.TimeSpan structure expressed in whole fractional seconds.
A może rozszerzenie
DateTime
? Drugi jest prawdopodobnie bardziej mylący, że jest wart, dopóki nie pojawią się rozszerzenia własności.źródło
Kiedy odejmiesz 1970 od bieżącego czasu, pamiętaj, że przedział czasu najczęściej będzie miał niezerowe pole milisekund. Jeśli z jakiegoś powodu jesteś zainteresowany milisekundami, pamiętaj o tym.
Oto, co zrobiłem, aby obejść ten problem.
źródło
Tego używam.
źródło
Połączyłem najbardziej eleganckie podejścia do tej metody użyteczności:
źródło
To rozwiązanie pomogło w mojej sytuacji:
za pomocą pomocnika w kodzie:
źródło
W systemie istnieje ToUnixTimeMilliseconds dla DateTimeOffset
Możesz napisać podobną metodę dla DateTime:
10000000L - konwersja tyknięć na sekundy
62135596800L - konwersja 01.01.01 na 01.01.1978
Nie ma problemu z Utc i przeciekami
źródło
Poniżej znajduje się dwukierunkowa klasa rozszerzenia, która obsługuje:
W przypadku OP użycie to:
lub
Chociaż istnieje bezpośrednia odpowiedź, uważam, że zastosowanie podejścia ogólnego jest lepsze. Zwłaszcza, że najprawdopodobniej jest to projekt, który wymaga takiej konwersji, i tak będzie potrzebował tych rozszerzeń, dlatego lepiej jest używać tego samego narzędzia dla wszystkich.
źródło
Użyłem tego po dłuższej walce, dotyczy to również przesunięcia strefy czasowej:
źródło
Prosty kod, którego używam:
Ten kod podaje uniksowy znacznik czasu, łącznie milisekund od 1970-01-01 do chwili obecnej.
źródło