Ich habe einen SQL-Server-Zeitstempel, den ich seit 1970 in eine Zeitdarstellung in Millisekunden konvertieren muss. Kann ich dies mit einfachem SQL tun? Wenn nicht, habe ich es in eine DateTime
Variable in C # extrahiert . Ist es möglich, eine Millisekunden-Darstellung davon zu erhalten?
Danke,
Teja.
c#
sql-server
datetime
Tejaswi Yerukalapudi
quelle
quelle
(now - Epoch).TotalMilliseconds
, wonow
undEpoch
sind DateTime-Objekte.Antworten:
Sie versuchen wahrscheinlich, in einen UNIX-ähnlichen Zeitstempel zu konvertieren, der sich in UTC befindet:
yourDateTime.ToUniversalTime().Subtract( new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc) ).TotalMilliseconds
Dies vermeidet auch Sommerprobleme, da UTC diese nicht hat.
quelle
DateTime
undTimeSpan
speichert ihre Werte mit höherer Genauigkeit als ganze Millisekunden. 0,79 ms = 7900 Ticks. Wenn Sie eine ganze Zahl benötigen, können Sie verwendenlong ms = myTimeSpan.TotalTicks / 10000;
.DateTime.UnixEpoch
anstelle der Deklaration des Datums verwenden.DateTime
(siehe Hinweis im Vertrag vonToUniversalTime
) in Ortszeit ist, was er nicht sein könnte. Zum Beispiel ist es üblich, Zeit mitDateTime.UtcNow
zu messen, oder es könnte in einer anderen Zeitzone liegen.In C # können Sie schreiben
(long)(date - new DateTime(1970, 1, 1)).TotalMilliseconds
quelle
long
stattint
:)new DateTime(1970, 1, 1).AddMilliseconds(myDateAsALong);
Wenn Sie den anderen Weg gehen wollen.AddMilliseconds()
erwartet einen Parameter vom Typdouble
. Eine implizite Konvertierung kümmert sich darum, aber es könnte erwähnenswert sein.int.MaxValue
In Millisekunden sind es ungefähr 25 Tage. Das ist wahrscheinlich nicht nützlich.Ab .NET 4.6 können Sie ein
DateTimeOffset
Objekt verwenden, um die Unix-Millisekunden abzurufen. Es verfügt über einen Konstruktor, der einDateTime
Objekt aufnimmt , sodass Sie Ihr Objekt wie unten gezeigt übergeben können.DateTime yourDateTime; long yourDateTimeMilliseconds = new DateTimeOffset(yourDateTime).ToUnixTimeMilliseconds();
Stellen Sie, wie in anderen Antworten angegeben, sicher, dass
yourDateTime
das richtigeKind
angegeben ist, oder.ToUniversalTime()
konvertieren Sie es zuerst in die UTC-Zeit.Hier erfahren Sie mehr darüber
DateTimeOffset
.quelle
ToUnixTimeMilliseconds()
ist verfügbar seit .NET 4.6.Now
nicht direkt auf diese Frage zutrifft.SELECT CAST(DATEDIFF(S, '1970-01-01', SYSDATETIME()) AS BIGINT) * 1000
Dies gibt Ihnen nicht die volle Präzision, führt jedoch
DATEDIFF(MS...
zu einem Überlauf. Wenn Sekunden gut genug sind, sollte dies der Fall sein.quelle
Diese andere Lösung für verdeckte Datums- und Uhrzeitangaben für 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; }
quelle
Mit der Antwort von Andoma mache ich das
Sie können eine Struktur oder eine Klasse wie diese erstellen
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(); } }
Und Sie können dies in Ihrem Code wie folgt verwenden
DateTime dateTime = DateTime.Now; double total = Date.GetTime(dateTime); dateTime = Date.DateTimeParse(total);
Ich hoffe das hilft dir
quelle
Es gibt
ToUnixTime()
undToUnixTimeMs()
Methoden in der DateTimeExtensions- KlasseDateTime.UtcNow.ToUnixTimeMs()
quelle