Ich habe mich gefragt, ob es eine Möglichkeit gibt, einen Zeitstempel in c # aus einer Datums- und Uhrzeitangabe zu erstellen. Ich benötige einen Millisekunden-Genauigkeitswert, der auch in Compact Framework funktioniert (da DateTime.ToBinary () in CF nicht vorhanden ist).
Mein Problem ist, dass ich diesen Wert datenbankunabhängig speichern möchte, damit ich ihn später sortieren und herausfinden kann, welcher Wert von einem anderen größer ist usw.
Ich benutze immer so etwas wie das Folgende:
public static String GetTimestamp(this DateTime value)
{
return value.ToString("yyyyMMddHHmmssfff");
}
Auf diese Weise erhalten Sie eine Zeichenfolge wie 200905211035131468, da die Zeichenfolge vom höchsten Bit des Zeitstempels zum niedrigsten Bit wechselt. Die einfache Sortierung der Zeichenfolgen in Ihren SQL-Abfragen kann zum Sortieren nach Datum verwendet werden, wenn Sie Werte in einer Datenbank speichern
Ich glaube, Sie können einen sekundengenauen Datenstempel im Unix-Stil erstellen, indem Sie Folgendes verwenden
//Find unix timestamp (seconds since 01/01/1970)
long ticks = DateTime.UtcNow.Ticks - DateTime.Parse("01/01/1970 00:00:00").Ticks;
ticks /= 10000000; //Convert windows ticks to seconds
timestamp = ticks.ToString();
Durch Anpassen des Nenners können Sie die Genauigkeit festlegen
Sie können die DateTime.Ticks-Eigenschaft verwenden, die lang und universell speicherbar ist und immer größer und auch auf dem kompakten Framework verwendbar ist. Achte nur darauf, dass dein Code nach dem 31. Dezember 9999 nicht mehr verwendet wird;)
Sie können auch verwenden
Stopwatch.GetTimestamp (). ToString ();
wenn Sie in Sekunden brauchen:
var timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;
Wenn Sie möchten, dass Zeitstempel den tatsächlichen Echtzeitzeiten entsprechen, sie jedoch auch eindeutig sind (für eine bestimmte Anwendungsinstanz), können Sie den folgenden Code verwenden:
public class HiResDateTime
{
private static long lastTimeStamp = DateTime.UtcNow.Ticks;
public static long UtcNowTicks
{
get
{
long orig, newval;
do
{
orig = lastTimeStamp;
long now = DateTime.UtcNow.Ticks;
newval = Math.Max(now, orig + 1);
} while (Interlocked.CompareExchange
(ref lastTimeStamp, newval, orig) != orig);
return newval;
}
}
}