2010-12-29 17 views
41

En mi aplicación genero archivos en oportunidades aleatorias. Para asegurar una denominación exclusiva, He intentado utilizar las nano segundos desde el 1.1.1970:¿Cómo funciona DateTime.Now.Ticks exactamente?

long time = DateTime.Now.Ticks; 
String fileName = Convert.ToString(time); 
Console.WriteLine(fileName); 

Ahora me observó algo extraño. ¿Por qué es la salida así? Quiero decir por qué los últimos 4 números son siempre los mismos? Puedo usar esto como un nombre de archivo, ese no es el problema, pero me lo estoy preguntando.

634292263478068039 
634292263512888039 
634292263541368039 
634292263603448039 
634292263680078039 
+9

'Ticks' no son los segundos nano desde' 1.1.1970', probablemente se confunda con el método 'getTime()' de JavaScript. Tomado del sitio web msdn oficial: * El valor de esta propiedad representa el número de intervalos de 100 nanosegundos que han transcurrido desde las 12:00:00 de la medianoche del 1 de enero de 0001 * (http://msdn.microsoft.com/en- us/library/system.datetime.ticks.aspx) –

+4

Para ser precisos, una marca no es un nanosegundo, una marca está destinada a representar 100 nanosegundos. –

+0

@Shadow Wizard: sí, eso es lo que necesito. –

Respuesta

35

La resolución de DateTime.Now depende de su temporizador del sistema (~ 10 ms en una corriente de SO Windows) ... por lo que está dando el mismo valor final allí (que no cuenta más finita que eso).

+1

¿Pero por qué es exactamente 39 al final y no un número par? – RoflcoptrException

+0

@Roflcoptr - Cuando comenzó a contar, ese era el valor, después de eso solo estás viendo ~ 10ms incrementos * desde el valor inicial *, espero que lo esté transmitiendo claramente ... avísame si no. –

+1

Sí, es más o menos claro, solo me pregunto por qué el valor siempre es 39 incluso si reinicio la computadora o la aplicación. – RoflcoptrException

0

para convertir la fecha y hora actual en un archivo nombre para guardar archivos que se pueden utilizar

DateTime.Now.ToFileTime()

esto debería resolver su objetivo

+3

No es mi voto negativo ... pero esto tendría los mismos problemas de resolución de tiempo que '.Ticks'. –

14

No es realmente una respuesta a su pregunta como se pidió, pero pensé que podría decir algo sobre tu objetivo general.

Ya existe un método para generar nombres de archivos aleatorios en .NET.

Ver System.Path.GetTempFileName y GetRandomFileName.

Como alternativa, es una práctica común utilizar un GUID para nombrar archivos aleatorios.

+0

Gracias, pero este método devuelve nombres criptográficos, por lo que prefiero solo algunos números que también tienen la ventaja de que es fácil compararlos entre sí – RoflcoptrException

11

Usted puede obtener los milisegundos desde 1/1/1970 utilizando dicho código:

private static DateTime JanFirst1970 = new DateTime(1970, 1, 1); 
public static long getTime() 
{ 
    return (long)((DateTime.Now.ToUniversalTime() - JanFirst1970).TotalMilliseconds + 0.5); 
} 
+3

o_O -> ¿cuál es el +0.5 al final? – Noctis

+3

@Noctis técnica de redondeo aproximado Me acostumbré al encasillamiento a entero/largo. 1.9 se convertiría a 2 de esta manera, y no a 1. –

+0

Interesante ... probablemente no es tan importante cuando estás proyectando un horario a milisegundos, pero lo tendré en cuenta para el futuro ... :) – Noctis

Cuestiones relacionadas