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

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

Estoy usando el siguiente código:

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

Pero devuelve el valor de la marca de tiempo de acuerdo con la zona horaria actual y necesito el resultado sin utilizar la zona horaria actual.

En el momento en que llamas a ToUniversalTime() , simplemente deshazte de eso:

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

Alternativamente, y bastante más razonablemente 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; } 

EDITAR: Como se indicó en los comentarios, el Kind de fecha y hora que ingresa no se tiene en cuenta al realizar la resta. Realmente deberías pasar un valor con un Kind de Utc para que esto funcione. Desafortunadamente, DateTime está un poco roto en este aspecto: mira mi publicación en el blog (una diatriba sobre DateTime ) para más detalles.

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

No estoy exactamente seguro de qué es lo que quieres. ¿Quieres un TimeStamp? Entonces puedes hacer algo simple como:

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

Dado que usted nombró una época variable, ¿desea el tiempo Unix equivalente a su fecha?

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

Encuentra la marca de tiempo de DateTime:

 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); } 

JonSkeet tiene una buena respuesta, pero como alternativa, si desea mantener el resultado más portátil, puede convertir la fecha en un formato ISO 8601 que luego podría leerse en la mayoría de los otros marcos, pero esto puede quedar fuera de sus requisitos.

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