2013-01-19 19 views
9

Perché la risoluzione minima di un DateTime è basata su zecche (unità di 100 nanosecondi) anziché su millisecondi?Perché DateTime è basato su zecche anziché millisecondi?

+0

Perché dovresti limitare la precisione di 'DateTime' in millisecondi (una serie di aspetti negativi, ad esempio, usi diverse unità per' TimeSpan', o non puoi avere 'StopWatch' return' TimeSpan's quando puoi avere precisione 100ns senza aspetti negativi? – CodesInChaos

+0

Sto cercando di capire la ragione pratica dietro Ticks. – mas

+14

Le zecche sono semplicemente la più piccola potenza di dieci che non provoca un overflow di Int64 quando rappresenta l'anno 9999. – CodesInChaos

risposta

21
  • TimeSpan e DateTime utilizzano le stesse Ticks rendendo operazioni quali l'aggiunta di un TimeSpan ad un DateTime banale.
  • Più precisione è buona. Utilmente utile per TimeSpan, ma la ragione sopra lo trasferisce a DateTime.

    Ad esempio StopWatch misura intervalli di tempo brevi spesso inferiori a un millisecondo. Può restituire un TimeSpan.
    In uno dei miei progetti ho utilizzato TimeSpan per indirizzare campioni audio. 100ns è abbastanza corto per quello, non lo sarebbero i millisecondi.

  • Anche utilizzando i tick di millisecondi è necessario un Int64 per rappresentare DateTime. Ma poi stai sprecando la maggior parte della gamma, dal momento che gli anni che vanno da 0 a 9999 non sono davvero utili. Così hanno scelto le zecche il più piccolo possibile, consentendo DateTime per rappresentare l'anno 9999.

    Ci sono circa 2 61,5 zecche con 100ns. Dal momento che il DateTime ha bisogno di due bit per la codifica correlata al fuso orario, i ticks 100ns sono il più piccolo intervallo power-of-ten che si adatta a un Int64.

Pertanto, l'utilizzo di zecche più lunghe ridurrebbe la precisione senza ottenere nulla. L'uso di tick più brevi non si adatta a 64 bit. => 100ns è il valore ottimale dati i vincoli.

+0

Buona risposta. Sì, se si dovessero usare solo 32 bit, come un 'int' o' uint', e anche se non si usassero due bit per informazioni sul "tipo di tempo", si potevano rappresentare solo meno di 50 giorni ('TimeSpan .FromMilliseconds (uint.MaxValue) ') con risoluzione al millisecondo. Se si desidera utilizzare un numero intero a 32 bit per questo, si utilizzerà _seconds_ come dimensione "tick", non millisecondi, e questo viene effettivamente eseguito nel cosiddetto "tempo Unix". Ancora avranno problemi perché usano solo 32 bit. –

+2

Ho usato questa domanda come domanda di intervista, molti anni fa. È stupefacente il numero di neolaureati che non riescono a capire quale sia la dimensione più piccola della zecca in modo tale che un intervallo di diecimila anni si adatti a un intero a 64 bit. –

+3

Cosa c'è di speciale negli anni 0 o 9999? Non vedo davvero come un oggetto DateTime sarà adatto per ogni anno prima dell'istituzione del calendario attuale (quanti giorni ci sono stati nelle colonie americane tra il 1 ° gennaio 1750 e il 1 ° gennaio 1760?), Né penso che il tipo sarà ancora usato dopo il 31 dicembre 2499. Provare ad usare un 'DateTime' per memorizzare valori sentinella come 1-1-0001 o 12-31-9999 come date effettive sembra pericoloso, dal momento che ci sono vari modi in cui può essere tradotto in date lineari. – supercat

2

per una maggiore risoluzione temporale, anche se non è necessario la maggior parte del tempo.

-2

Il segno di spunta è l'orologio di sistema con cui funziona.

+1

Ne sei sicuro? Pensavo che l'orologio di sistema fosse preciso solo a 10-30 msec. – mas

+0

@mas Ciò non significa necessariamente che non utilizzi ticks da 100 ns come unità. – svick

+0

No, non è così. Il sistema operativo Windows restituisce solo unità con precisione millisecondo nella sua struttura [SYSTEMTIME] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724950.aspx). E secondo [questo articolo] (http://msdn.microsoft.com/en-us/magazine/cc163996.aspx) è preciso solo tra 10 e 15 millisecondi. Lo stesso articolo continua con come ottenere una risoluzione inferiore al millisecondo usando i contatori delle prestazioni. I risultati potrebbero certamente essere rappresentati in un DateTime o TimeSpan in C#. –

3

Da MSDN;

Un singolo segno di spunta rappresenta un centinaio di nanosecondi o un decimo di milionesimo di un secondo. Ci sono 10.000 zecche in un millisecondo.

un segno di spunta rappresenta il numero totale di zecche in ora locale, che è la mezzanotte il 1 ° gennaio dell'anno 0001. Ma un segno di spunta è anche più piccola unità per TimeSpan anche. Poiché le zecche sono Int64, quindi, se i millisecondi vengono utilizzati al posto delle zecche, può verificarsi una perdita di informazioni.

Potrebbe anche essere un'implementazione predefinita CLS.

+0

Sì, lo so, vedi, domanda: "100 nanosecondi". – mas

+5

La risposta "Perché" con "Perché è così" non è utile. – CodesInChaos

Problemi correlati