Darstellung von DateTime in Millisekunden?

81

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 DateTimeVariable in C # extrahiert . Ist es möglich, eine Millisekunden-Darstellung davon zu erhalten?

Danke,
Teja.

Tejaswi Yerukalapudi
quelle
1
Für die letztere Frage : (now - Epoch).TotalMilliseconds, wo nowund Epochsind DateTime-Objekte.

Antworten:

143

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.

Andomar
quelle
2
Dies ergibt einen Bruchteil als Ausgabe, zum Beispiel: "1552678714362.79" Woher kommt die ".79"?
Sharif Yazdian
2
@ SharifYazdian Es ist genau das, was Sie erwarten würden, es sind 0,79 Millisekunden. Die Systemzeit wird in Ticks gemessen. Vorausgesetzt, 1 Millisekunde hat 10000 Ticks DateTimeund TimeSpanspeichert ihre Werte mit höherer Genauigkeit als ganze Millisekunden. 0,79 ms = 7900 Ticks. Wenn Sie eine ganze Zahl benötigen, können Sie verwenden long ms = myTimeSpan.TotalTicks / 10000;.
LWChris
2
In .NET Core (> 2.1) können Sie DateTime.UnixEpochanstelle der Deklaration des Datums verwenden.
Thom
1
Dieser Code hat ein Problem: Er geht davon aus, dass der DateTime(siehe Hinweis im Vertrag von ToUniversalTime) in Ortszeit ist, was er nicht sein könnte. Zum Beispiel ist es üblich, Zeit mit DateTime.UtcNowzu messen, oder es könnte in einer anderen Zeitzone liegen.
Ceztko
69

In C # können Sie schreiben

(long)(date - new DateTime(1970, 1, 1)).TotalMilliseconds
SLaks
quelle
15
Ich schlage eine Besetzung vor longstatt int:)
Jon Skeet
4
new DateTime(1970, 1, 1).AddMilliseconds(myDateAsALong);Wenn Sie den anderen Weg gehen wollen.
JackMorrissey
@ JackMorrissey: AddMilliseconds()erwartet einen Parameter vom Typ double. Eine implizite Konvertierung kümmert sich darum, aber es könnte erwähnenswert sein.
Axel Kemper
@ JonSkeet Warum schlägst du vor, zu lange statt int zu gießen? :)
Roxy'Pro
4
@ Roxy'Pro: int.MaxValueIn Millisekunden sind es ungefähr 25 Tage. Das ist wahrscheinlich nicht nützlich.
Jon Skeet
35

Ab .NET 4.6 können Sie ein DateTimeOffsetObjekt verwenden, um die Unix-Millisekunden abzurufen. Es verfügt über einen Konstruktor, der ein DateTimeObjekt 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 yourDateTimedas richtige Kindangegeben ist, oder .ToUniversalTime()konvertieren Sie es zuerst in die UTC-Zeit.

Hier erfahren Sie mehr darüber DateTimeOffset.

Bob
quelle
1
ToUnixTimeMilliseconds () ist in .Net 3.5 nicht vorhanden.
NickLokarno
1
Laut MSDN , ToUnixTimeMilliseconds()ist verfügbar seit .NET 4.6
NM
1
@kayleeFrye_onDeck Das OP fragt nach einem Zeitstempel aus einer Datenbank, sodass Ihr Kommentar zu .Nownicht direkt auf diese Frage zutrifft.
Bob
2
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
2

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;
} 
samsanthosh2008
quelle
1

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

Pablo V.
quelle
1

Es gibt ToUnixTime()und ToUnixTimeMs()Methoden in der DateTimeExtensions- Klasse

DateTime.UtcNow.ToUnixTimeMs()

dmirg
quelle