95

Zastanawiam się, czy istnieje sposób na stworzenie znacznika czasu w języku C# z datetime? Potrzebuję wartości dokładności milisekundy, która również działa w Compact Framework (mówiąc, że od DateTime.ToBinary() nie istnieje w CF).Funkcja, która tworzy znacznik czasu w C#

Moim problemem jest to, że chcę, aby zapisać tę wartość w bazie danych agnostykiem sposób, aby można było go SortBy później i dowiedzieć się, która wartość jest większa od drugiej itd

+2

Zaakceptowanych odpowiedź tutaj daje miłe rozwiązanie, ale jeśli chcesz prawdziwego znacznik czasu, sprawdź to Q/A: http://stackoverflow.com/questions/ 9814060/how-to-convert-datetime-to-timestamp-using-c-netignoring-current-timezone/9814280 # 9814280 – inanutshellus

Odpowiedz

189

Zawsze używam coś jak następuje:

public static String GetTimestamp(this DateTime value) 
{ 
    return value.ToString("yyyyMMddHHmmssfff"); 
} 

To daje ciąg jak 200905211035131468 jako ciąg przechodzi od najwyższego rzędu bity znacznika czasowego do najniższego rzędu proste sortowanie ciągów w zapytaniach SQL może być używane do sortowania według daty, jeśli przechowujesz wartości w bazie danych

+4

Jak to się stało, że masz 21 miesięcy i dostajesz tylko 12? :) – PaulB

+1

błąd od mojej strony, poprawiony teraz – RobV

+2

Token na rok powinien być pisany małymi literami tutaj: wartość zwracana.ToString ("yyyyMMddHHmmssffff"); –

18

Można użyć właściwości DateTime.Ticks, który to długa i uniwersalna pamięć do przechowywania, zawsze zwiększająca się i użyteczna również w kompaktowych ramach. Wystarczy upewnić się, że kod nie jest stosowany po dniu 31 grudnia 9999;)

+0

hmmm ciekawe, wypróbuję to. – Konstantinos

+0

Kiedy mówisz "zawsze rosnące" - nie ma żadnej gwarancji, że dwa połączenia z DateTime.UtcNow.Ticks będą dawały różne wartości, prawda? Innymi słowy, nadal musisz zachować ostrożność, zanim użyjesz go jako unikalnego znacznika czasu. –

+0

faktycznie po prostu go użyłem i mam zduplikowane wartości w niektórych punktach. – Konstantinos

41

Wierzę, że możesz stworzyć datownik jednoznaczny z dokładnością do sekundy, używając następujących

//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(); 

Regulacja mianownika pozwala wybrać swój poziom precyzji

+0

Und, że 1 działa na .NET Compact Framework? – ppumkin

+1

Aby uzyskać lepsze rozwiązanie, zobacz: http://stackoverflow.com/a/26225744/187650 – juFo

3

Jeśli chcesz znaczniki czasu, które odpowiadają rzeczywistemu rzeczywistych czasów ale także chcą im być unikalna (dla danej instancji aplikacji), można użyć następującego kodu :

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; 
     } 
    } 
} 
7

można również użyć

Stopwatch.GetTimestamp() toString().

2

gdy u trzeba w sekundach:

var timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;