2011-03-05 17 views
10

Necesito convertir un DateTime en una marca de tiempo Unix. Así que googled que buscar un código de ejemplo¿Por qué el uso de DateTime en Unix utiliza un doble en lugar de un número entero?

En casi todos los resultados que veo, que utilizan double como el cambio de una función de este tipo, incluso cuando explícitamente mediante floor para convertirlo en un entero. Las marcas de tiempo de Unix son siempre enteros. Entonces, ¿qué problema hay con el uso de long o int en lugar del doble?

static double ConvertToUnixTimestamp(DateTime date) 
{ 
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0); 
    TimeSpan diff = date - origin; 
    return Math.Floor(diff.TotalSeconds); 
} 
+0

mi humilde opinión no para validar la fecha de entrada. Debería devolver una estructura larga o una estructura ad-hoc – onof

+1

No hay ninguna razón, solo es un código sórdido. Emitido a largo, no puede desbordarse. –

+0

Agregaré que, por definición, la marca de tiempo de Unix es UTC. El método debería verificar si DateTime.Kind es UTC, Local o Unspecified. Como mínimo, si el Local I convertiría a UTC antes de realizar la conversión. Opcionalmente, si desea una marca de tiempo Unix que sea local, puede agregar una sobrecarga o un parámetro para no realizar la conversión a UTC. – Nate

Respuesta

3

Por lo general, lo implementaría con una longitud sin signo en lugar de requerir que el usuario redondee hacia arriba o hacia abajo y que se lance a una int o larga. Una razón por la que alguien podría querer un doble es si se estuviera usando una estructura similar a timeval, como en gettimeofday. Permite una precisión por debajo del segundo ...

3

Para evitar el error 2038 en sistemas de 32 bits?

+7

Uno pensaría que podrían haber usado un largo sin embargo. – nos

1

Los dobles cubren más terreno que cualquier otra variable en el tipo int.

+0

sí, pero un 'largo' cubriría miles de años. Seguramente mi software no se ejecutará en un par de miles de años. – Earlz

+0

Supongo que si tiene algún software que necesita calcular algo eones en el futuro o en el pasado, puede ayudar. Sin embargo, ese es un caso especial, y uno probablemente usaría un tipo de datos personalizado bajo dicho escenario. – Nate

-1

No es una cuestión de "años". pero de horas en una (s) máquina (s) razonable (es), debidamente relacionadas.

Pero, ¿te imaginas recopilar el enorme almacenamiento? Tengo alrededor de 30TB de datos y me inundan: dedico más tiempo a la catalogación que al trabajo real.

buena suerte en sus esfuerzos

Cuestiones relacionadas