Mam sygnaturę czasową serwera SQL, którą muszę przekonwertować na reprezentację czasu w milisekundach od 1970 r. Czy mogę to zrobić za pomocą zwykłego języka SQL? Jeśli nie, wyodrębniłem go do DateTime
zmiennej w C #. Czy można uzyskać reprezentację w milisekundach?
Dzięki,
Teja.
c#
sql-server
datetime
Tejaswi Yerukalapudi
źródło
źródło
(now - Epoch).TotalMilliseconds
gdzienow
iEpoch
są obiektami DateTime.Odpowiedzi:
Prawdopodobnie próbujesz przekonwertować na znacznik czasu podobny do UNIX, który jest w UTC:
yourDateTime.ToUniversalTime().Subtract( new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc) ).TotalMilliseconds
Pozwala to również uniknąć problemów w okresie letnim, ponieważ UTC ich nie ma.
źródło
DateTime
iTimeSpan
przechowuj ich wartości z większą dokładnością niż całe milisekundy. 0,79 ms = 7900 tyknięć. Jeśli potrzebujesz liczby całkowitej, możesz użyćlong ms = myTimeSpan.TotalTicks / 10000;
.DateTime.UnixEpoch
zamiast deklarowania daty.DateTime
(patrz uwaga w umowieToUniversalTime
) jest w czasie lokalnym, czego nie może. Na przykład często próbkuje się czas zDateTime.UtcNow
inną strefą czasową lub może to być w innej strefie czasowej.W C # możesz pisać
(long)(date - new DateTime(1970, 1, 1)).TotalMilliseconds
źródło
long
zamiastint
:)new DateTime(1970, 1, 1).AddMilliseconds(myDateAsALong);
Jeśli chcesz iść w drugą stronę.AddMilliseconds()
oczekuje parametru typudouble
. Dba o to niejawna konwersja, ale warto zauważyć.int.MaxValue
w milisekundach to około 25 dni. To raczej nie będzie przydatne.Począwszy od .NET 4.6, można użyć
DateTimeOffset
obiektu, aby uzyskać milisekundy systemu UNIX. Ma konstruktora, który pobieraDateTime
obiekt, więc możesz po prostu przekazać swój obiekt, jak pokazano poniżej.DateTime yourDateTime; long yourDateTimeMilliseconds = new DateTimeOffset(yourDateTime).ToUnixTimeMilliseconds();
Jak wspomniano w innych odpowiedziach, upewnij się,
yourDateTime
żeKind
podano poprawne lub użyj.ToUniversalTime()
najpierw, aby przekonwertować go na czas UTC.Tutaj możesz dowiedzieć się więcej o
DateTimeOffset
.źródło
ToUnixTimeMilliseconds()
jest dostępny od .NET 4.6.Now
nie dotyczy bezpośrednio tego pytania.SELECT CAST(DATEDIFF(S, '1970-01-01', SYSDATETIME()) AS BIGINT) * 1000
Nie daje to pełnej precyzji, ale
DATEDIFF(MS...
powoduje przepełnienie. Jeśli sekundy są wystarczająco dobre, powinno to wystarczyć.źródło
To inne rozwiązanie dla ukrytej daty i godziny do unixtimestampmillis C #.
private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); public static long GetCurrentUnixTimestampMillis() { DateTime localDateTime, univDateTime; localDateTime = DateTime.Now; univDateTime = localDateTime.ToUniversalTime(); return (long)(univDateTime - UnixEpoch).TotalMilliseconds; }
źródło
Używając odpowiedzi Andomy, właśnie to robię
Możesz stworzyć Strukturę lub Klasę taką jak ta
struct Date { public static double GetTime(DateTime dateTime) { return dateTime.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; } public static DateTime DateTimeParse(double milliseconds) { return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(milliseconds).ToLocalTime(); } }
Możesz użyć tego w swoim kodzie w następujący sposób
DateTime dateTime = DateTime.Now; double total = Date.GetTime(dateTime); dateTime = Date.DateTimeParse(total);
Mam nadzieję, że to ci pomoże
źródło
Istnieją
ToUnixTime()
iToUnixTimeMs()
metody w klasie DateTimeExtensionsDateTime.UtcNow.ToUnixTimeMs()
źródło