95

Mi chiedevo, c'è un modo per creare un timestamp in C# da un datetime? Ho bisogno di un valore di precisione millisecondo che funzioni anche in Compact Framework (dicendo che dal momento che DateTime.ToBinary() non esiste in CF).Funzione che crea un timestamp in C#

Il mio problema è che voglio per memorizzare questo valore in modo indipendente dal database in modo che io possa sortby in un secondo momento e scoprire quale valore è maggiore di un altro ecc

+2

La risposta accettata qui dà una bella soluzione, ma se si vuole un vero e proprio timestamp, controlla questo Q/A: http://stackoverflow.com/questions/ 9814060/how-to-convert-datetime-to-timestamp-using-c-netignoring-current-timezone/9814280 # 9814280 – inanutshellus

risposta

189

uso sempre qualcosa come il seguente:

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

Questo vi darà una stringa come 200.905.211.035,131468 millions, come la stringa va dal più alto ordine i bit del timestamp all'ordinamento più semplice stringa semplice nelle tue query SQL possono essere usati per ordinare per data se stai incollando valori in un database

+4

Come mai hai 21 mesi e ne ricevi solo 12? :) – PaulB

+1

mistype da parte mia, corretto ora – RobV

+2

Il token per anno deve essere in minuscolo qui: valore restituito. ToString ("aaaaMMggHHmmssffff"); –

18

Si potrebbe utilizzare la proprietà DateTime.Ticks, che è un archivio lungo e universale, sempre crescente e utilizzabile anche nella struttura compatta. Basta assicurarsi che il codice non viene utilizzato dopo il 31 dicembre 9999;)

+0

hmmm interessante, lo proverò. – Konstantinos

+0

Quando si dice "sempre crescente", non è possibile garantire che due chiamate a DateTime.UtcNow.Ticks diano valori diversi però, c'è? In altre parole, hai ancora bisogno di un po 'di cautela prima di usarla come un timestamp unico. –

+0

in realtà l'ho appena usato e ho dei valori duplicati in alcuni punti. – Konstantinos

41

Credo che si possa creare un datastamp stile unix accurato ad un secondo usando il seguente

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

Regolazione del denominatore consente di scegliere il livello di precisione

+0

Und che 1 funziona su .NET Compact Framework? – ppumkin

+1

Per una soluzione migliore, consultare: http://stackoverflow.com/a/26225744/187650 – juFo

3

Se volete timestamp che corrispondono ai tempi reali reali ma vogliono anche loro di essere unico (per una determinata istanza di applicazione), è possibile utilizzare il seguente codice :

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

È anche possibile utilizzare

Stopwatch.GetTimestamp() ToString();.

2

quando u bisogno in pochi secondi:

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