2016-01-26 2 views
6

ho due volte in questo modo: TicksCome troncare i millisecondi "Ticks" senza convertirli in datetime?

//2016-01-22​T17:34:52.648Z 
var tick1 = 635890808926480754; 

//2016-01-22​T17:34:52.000Z 
var tick2 = 635890808920000000; 

Ora, come si può vedere confrontando questi due numeri tick1 == tick2 returns false

anche se le date sono le stesse (a parte millisecondi).

vorrei troncare i millisecondi fuori questi numeri senza convertirlo in un datetime (perché questo ridurrebbe l'efficienza)

Ho guardato Math.Round che dice:

Arrotonda un valore al numero intero più vicino o al numero specificato di cifre frazionarie.

e anche Math.Truncate nessuno dei quali credo faccia quello che mi serve.

Guardando Datetime.Ticks si dice:

Un unico segno di spunta rappresenta un centinaio di nanosecondi o di un dieci-milionesimo di secondo. Ci sono 10.000 zecche in un millisecondo o 10 milioni di zecche in un secondo.

Pertanto, devo arrotondare il numero ai dieci milioni più vicini.

È possibile?

+0

dividerlo per 10000000f e utilizzare Math.Ceil sul risultato? – Icepickle

risposta

11

Si potrebbe utilizzare divisione intera:

if (tick1/TimeSpan.TicksPerSecond == tick2/TimeSpan.TicksPerSecond) 

Questo funziona perché se si divide un long/int da un long/int il risultato è anche un long/int quindi troncando la parte decimale.

+1

Non sono sicuro del perché questo si sta alzando votato.Se 'tick1 == tick2 restituisce false' allora' tick1/10000000 == tick2/10000000' restituirebbe anche false a meno che non si tronchi dopo la divisione. Questo è solo algebra? O mi sta sfuggendo qualcosa? – user1

+2

@ user1 Perché sta troncando. Se dividi un 'long' o' int' di un 'long' o' int' il risultato è anche un 'long' o' int' che tronca la parte decimale. –

+2

@scottChamberlain hai ragione. Provenendo da un background matematico, odio i numeri in informatica – user1

-1

dividerlo per 1000 in questo modo:

Long Seconds = 635890808926480754/1000 

//Seconds = 635890808926480 
+0

Downvoter può anche commentare. Mi aiuterà a capire il mio errore. –

+0

@ScottChamberlain I was not the downvoter. Non farei mai downvote senza sapere con certezza che una risposta non è corretta – user1

+2

Dividere per 1000 non è sufficiente. Come per l'altra risposta (e la citazione nella domanda - _ "10 milioni di zecche in un secondo" _), devi farlo entro 10.000.000. –

6

È possibile utilizzare questo:

if(Math.Abs(tick1 - tick2) < TimeSpan.TicksPerSecond) 

Quale evitare di fare divisioni.

Si può regolare la precisione è necessario con uno dei seguenti:

  • TimeSpan.TicksPerDay
  • TimeSpan.TicksPerHour
  • TimeSpan.TicksPerMinute
  • TimeSpan.TicksPerSecond
  • TimeSpan.TicksPerMillisecond