Perché la risoluzione minima di un DateTime è basata su zecche (unità di 100 nanosecondi) anziché su millisecondi?Perché DateTime è basato su zecche anziché millisecondi?
risposta
TimeSpan
eDateTime
utilizzano le stesseTicks
rendendo operazioni quali l'aggiunta di unTimeSpan
ad unDateTime
banale.Più precisione è buona. Utilmente utile per
TimeSpan
, ma la ragione sopra lo trasferisce aDateTime
.Ad esempio
StopWatch
misura intervalli di tempo brevi spesso inferiori a un millisecondo. Può restituire unTimeSpan
.
In uno dei miei progetti ho utilizzatoTimeSpan
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, consentendoDateTime
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.
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. –
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. –
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
per una maggiore risoluzione temporale, anche se non è necessario la maggior parte del tempo.
Il segno di spunta è l'orologio di sistema con cui funziona.
Ne sei sicuro? Pensavo che l'orologio di sistema fosse preciso solo a 10-30 msec. – mas
@mas Ciò non significa necessariamente che non utilizzi ticks da 100 ns come unità. – svick
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#. –
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
.
Sì, lo so, vedi, domanda: "100 nanosecondi". – mas
La risposta "Perché" con "Perché è così" non è utile. – CodesInChaos
- 1. Come troncare i millisecondi "Ticks" senza convertirli in datetime?
- 2. Come stampare DateTime senza millisecondi
- 3. Perché/come è tutto $() basato su jQuery?
- 4. Perché DropDownList.SelectedValue è basato su viewstate?
- 5. Perché perdo millisecondi di un DateTime quando viene passato a un metodo che accetta Nullable DateTime?
- 6. Converti millisecondi UTC in DATETIME nel server SQL
- 7. ZF2 è basato su MOVE?
- 8. MySQL 5.6 DATETIME non accetta millisecondi/microsecondi
- 9. SQL Server millisecondi Remove from datetime
- 10. Rimuovi ore: secondi: millisecondi nell'oggetto DateTime
- 11. Perché il servizio Web basato su SOAP non è RESTful?
- 12. Perché questo contratto basato su stringhe.Esure non è stato verificato?
- 13. perché SAML è basato sul browser
- 14. millisecondi miei cambiamenti DateTime quando memorizzati in SQL Server
- 15. Spring @RequestParam mapping Boolean basato su 1 o 0 anziché su vero o falso
- 16. rotonda .NET DateTime millisecondi, in modo che possa andare bene millisecondi SQL Server
- 17. DateTime non è uguale
- 18. Perché System.in è dichiarato nullInputStream() anziché null?
- 19. Perché la formattazione di un DateTime come una stringa viene troncata e non attorno ai millisecondi?
- 20. Come posso aggiungere N millisecondi per un datetime in Python
- 21. Ottenere la differenza di due istanze DateTime in millisecondi
- 22. Convertire il periodo di tempo in formato ISO 8601 con zecche/millisecondi
- 23. Perché GetType() restituendo tipo DateTime per Nullable <DateTime>
- 24. È SMTP basato su TCP o UDP?
- 25. SQL Server 2008 e millisecondi
- 26. Perché NDEBUG anziché RELEASE?
- 27. File system basato su tag
- 28. Perché testFixture anziché TestClass?
- 29. Come leggere datetime back da sqlite come un datetime anziché una stringa in Python?
- 30. Perché TimeSpan.FromSeconds (double) round in millisecondi?
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
Sto cercando di capire la ragione pratica dietro Ticks. – mas
Le zecche sono semplicemente la più piccola potenza di dieci che non provoca un overflow di Int64 quando rappresenta l'anno 9999. – CodesInChaos