Estoy tratando de convertir una variable DateTime de C # a tiempo de Unix, es decir, el número de segundos desde el 1 de enero de 1970. Parece que un DateTime está realmente implementado como el número de 'ticks' desde el 1 de enero de 0001.
Mi pensamiento actual es restar el 1 de enero de 1970 de mi DateTime de esta manera:
TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;
¿Existe una forma mejor?
Respuestas:
Eso es básicamente todo. Estos son los métodos que utilizo para convertir hacia y desde la época de Unix:
Actualización: A partir de .Net Core 2.1 y .Net Standard 2.1, se puede obtener un DateTime igual a Unix Epoch de la estática
DateTime.UnixEpoch
.fuente
t specify this explicitly and somewhere later in code you
tiene ToUniversalTime (), terminará con un mal tiempo Utc, porque por defecto DateTime NO es Utc.Si el resto de su sistema está bien con DateTimeOffset en lugar de DateTime, hay una característica realmente conveniente:
fuente
var time = DateTimeOffset.FromUnixTimeSeconds(5000);
MS DocLo único que veo es que se supone que es desde la medianoche del 1 de enero de 1970 UTC
fuente
Probablemente desee utilizar DateTime.UtcNow para evitar problemas de zona horaria
fuente
Ese enfoque será bueno si la fecha y hora en cuestión está en UTC, o representa la hora local en un área que nunca ha observado el horario de verano. Las rutinas de diferencia de fecha y hora no tienen en cuenta el horario de verano y, en consecuencia, considerarán la medianoche del 1 de junio como un múltiplo de 24 horas después de la medianoche del 1 de enero. No tengo conocimiento de nada en Windows que informe las reglas históricas de ahorro de luz del día para la locale, por lo que no creo que haya una buena manera de manejar correctamente cualquier momento antes del cambio de regla de horario de verano más reciente.
fuente
Puede crear un startTime y endTime de DateTime, luego hacer endTime.Subtract (startTime). Luego genere su intervalo.Segundos.
Creo que debería funcionar.
fuente
Utilizo el año 2000 en lugar de Epoch Time en mi cálculo. Trabajar con números más pequeños es fácil de almacenar y transportar y es compatible con JSON.
Segundos desde el año 2000 :
Segundos de Unix Time:
Por ejemplo, el año 2020 es:
var year2020 = (nuevo DateTime ()). AddYears (2019) .Ticks; // Porque DateTime ya comienza en el año 1
637134336000000000 Garrapatas desde el 1 de enero de 0001
63713433600 Segundos desde el 1 de enero de 0001
1577836800 Segundos desde Epoch Time
631152000 Segundos desde el año 2000
Referencias:
Convertidor de época: https://www.epochconverter.com
Convertidor del año 1: https://www.epochconverter.com/seconds-days-since-y0
fuente