2012-03-21 55 views
19

¿Cómo convierto datetime a timestamp usando C# .NET (ignorando la zona horaria actual)?Cómo convertir datetime a timestamp usando C# /. NET (ignorando la zona horaria actual)

Estoy utilizando el código de abajo:

private long ConvertToTimestamp(DateTime value) 
{ 
    long epoch = (value.ToUniversalTime().Ticks - 621355968000000000)/10000000; 
    return epoch; 
} 

pero devuelve el valor de marca de tiempo de acuerdo a la zona horaria actual & y necesito el resultado sin necesidad de utilizar la zona horaria actual.

+0

http://stackoverflow.com/questions/892074/function-that-creates-a-timestamp-in-c-sharp – Prescott

Respuesta

5

No estoy exactamente seguro de qué es lo que quiere. ¿Quieres un TimeStamp? A continuación, puede hacer algo tan simple como:

TimeStamp ts = TimeStamp.FromTicks(value.ToUniversalTime().Ticks); 

Dado que usted nombró una época variables, qué quiere el tiempo Unix equivalente de su fecha?

DateTime unixStart = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc); 
long epoch = (long)Math.Floor((value.ToUniversalTime() - unixStart).TotalSeconds); 
+0

DateTime DateTime = unixStart .SpecifyKind (new DateTime (1970, 1, 1), DateTimeKind.Utc); long epoch = (long) Math.Floor ((value.ToUniversalTime() - unixStart) .TotalSeconds); esto también devuelve el mismo resultado que el de mi código ... – User

+0

Entonces no entiendo qué le pasa a su código. Utilizo esto en el código de producción para obtener la marca de tiempo de Unix (que es UTC) y, hasta donde sé, funciona. No importa en qué zona horaria esté el 'valor ', siempre obtengo la hora UTC correspondiente correcta. – Jensen

+0

Si solo desea el tiempo de época, correspondiente a la misma zona horaria que el valor original, entonces el código publicado por Jon Skeet es correcto. – Jensen

42

En el momento en que está llamando ToUniversalTime() - acaba de deshacerse de ese:

private long ConvertToTimestamp(DateTime value) 
{ 
    long epoch = (value.Ticks - 621355968000000000)/10000000; 
    return epoch; 
} 

Alternativamente, y bastante más legible IMO:

private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
... 

private static long ConvertToTimestamp(DateTime value) 
{ 
    TimeSpan elapsedTime = value - Epoch; 
    return (long) elapsedTime.TotalSeconds; 
} 

EDIT: Como se indica en el comentarios, el Kind del DateTime que pasa no se tiene en cuenta cuando realiza la resta. Realmente debe pasar un valor con Kind de Utc para que esto funcione. Desafortunadamente, DateTime está un poco roto en este aspecto - vea my blog post (una diatriba sobre DateTime) para más detalles.

Es posible que desee utilizar mi API de fecha/hora Noda Time que hace que todo sea más claro, IMO.

+0

Prefiera el segundo también. El Op no dijo para qué lo quería, pero ¿el resultado es equivalente a lo que generaría SqlServer al crear una marca de tiempo si la convirtiera en binaria? Además, ¿por qué el elenco de larga duración no ha disparado VS para verificar pero TotalSeconds no devuelve una respuesta larga? – Bronumski

+0

@Bronumski: No, devuelve un 'doble'. No sé si es comparable, me temo, no sé qué hace SQL Server. –

+0

SQL Server tiene 0 = 1900-01-01 00:00:00.000, de acuerdo con la prueba de crear un datetime y meter números en él. Agregar 1 agrega 1 día. Agregar 0.5 agrega 12 horas. El valor puede ser inferior a 0 para los años anteriores a 1900. – Brian

1

JonSkeet tiene una buena respuesta, pero como alternativa si quería mantener el resultado más portátil que podría convertir la fecha en un formato ISO 8601 que entonces se podía leer en la mayoría de los otros marcos, pero esto puede caer fuera de sus necesidades.

value.ToUniversalTime().ToString("O"); 
1

Búsqueda de marca de tiempo Tiempo:

private long ConvertToTimestamp(DateTime value) 
{ 
    TimeZoneInfo NYTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
    DateTime NyTime = TimeZoneInfo.ConvertTime(value, NYTimeZone); 
    TimeZone localZone = TimeZone.CurrentTimeZone; 
    System.Globalization.DaylightTime dst = localZone.GetDaylightChanges(NyTime.Year); 
    NyTime = NyTime.AddHours(-1); 
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime(); 
    TimeSpan span = (NyTime - epoch); 
    return (long)Convert.ToDouble(span.TotalSeconds); 
} 
+0

¡no usaste dst para nada! – HamedH

Cuestiones relacionadas