Espero hacer esta pregunta y sus respuestas como la guía definitiva para lidiar con el horario de verano, en particular para lidiar con los cambios reales.
Si tiene algo que agregar, por favor hágalo
Muchos sistemas dependen de mantener la hora exacta, el problema es con los cambios en el horario debido al horario de verano: mover el reloj hacia adelante o hacia atrás.
Por ejemplo, uno tiene reglas comerciales en un sistema de toma de pedidos que dependen de la hora del pedido; si el reloj cambia, las reglas pueden no ser tan claras. ¿Cómo debe persistir el tiempo de la orden? Por supuesto, hay una infinidad de escenarios: este es simplemente ilustrativo.
- ¿Cómo ha solucionado el problema del horario de verano?
- ¿Qué supuestos son parte de su solución? (buscando contexto aquí)
Tan importante, si no más:
- ¿Qué intentaste que no funcionó?
- ¿Por qué no funcionó?
Me interesaría la programación, el sistema operativo, la persistencia de datos y otros aspectos pertinentes del problema.
Las respuestas generales son geniales, pero también me gustaría ver detalles, especialmente si solo están disponibles en una plataforma.
GETDATE()
en SQL será UTC (como lo haráDateTime.Now
). Y el servidor no se verá afectado por ningún tipo de cambio automático de horario de verano.DateTime.UtcNow
yGETUTCDATE()
, también muestra otros desarrolladores que realmente has pensado en elloRespuestas:
Resumen de respuestas y otros datos: (agregue los suyos)
Hacer:
datetimeoffset
tipo que puede almacenar ambos en un solo campo.1970-01-01T00:00:00Z
(excluyendo los segundos bisiestos). Si necesita mayor precisión, use milisegundos en su lugar. Este valor siempre debe basarse en UTC, sin ningún ajuste de zona horaria.DateTimeOffset
menudo es una mejor opción queDateTime
.DateTime
yDateTimeZone
clases. Tenga cuidado al usarDateTimeZone::listAbbreviations()
- vea la respuesta . Para mantener PHP con datos actualizados de Olson, instale periódicamente el paquete timezonedb PECL; véase la respuesta .>=
,<
).No:
America/New_York
con un "desplazamiento de zona horaria", como-05:00
. Son dos cosas diferentes. Vea el wiki de etiqueta de zona horaria .Date
objeto de JavaScript para realizar cálculos de fecha y hora en navegadores web más antiguos, ya que ECMAScript 5.1 y versiones anteriores tienen un defecto de diseño que puede utilizar incorrectamente el horario de verano. (Esto se solucionó en ECMAScript 6/2015).Pruebas:
Referencia:
timezone
página wiki de etiqueta detallada en Stack Overflowdst
timezone
Otro:
fuente
No estoy seguro de qué puedo agregar a las respuestas anteriores, pero aquí hay algunos puntos de mi parte:
Tipos de tiempos
Hay cuatro momentos diferentes que debe considerar:
También hay tiempo histórico / alternativo. Estos son molestos porque es posible que no se correspondan con el tiempo estándar. Por ejemplo: fechas julianas, fechas según un calendario lunar en Saturno, el calendario klingon.
El almacenamiento de marcas de tiempo de inicio / finalización en UTC funciona bien. Para 1, necesita un nombre de zona horaria de evento + desplazamiento almacenado junto con el evento. Para 2, necesita un identificador de hora local almacenado con cada región y un nombre de zona horaria local + desplazamiento almacenado para cada espectador (es posible derivar esto de la IP si tiene problemas). Para 3, almacene en segundos UTC y no necesita zonas horarias. 4 es un caso especial de 1 o 2 dependiendo de si se trata de un evento global o local, pero también debe almacenar un creado en la marca de tiempo para que pueda saber si una definición de zona horaria cambió antes o después de que se creó este evento. Esto es necesario si necesita mostrar datos históricos.
Tiempos de almacenamiento
Desplazamientos y nombres
Un ejemplo de lo anterior sería:
Con esta información, podemos determinar históricamente la hora exacta en que se llevaron a cabo las finales de la WCS 2010, incluso si la definición de la zona horaria de Sudáfrica cambia, y poder mostrar eso a los espectadores en su zona horaria local en el momento en que consultan la base de datos.
Hora del sistema
También debe mantener sincronizados los archivos tzdata de su sistema operativo, base de datos y aplicaciones, tanto entre sí como con el resto del mundo, y realizar pruebas exhaustivas cuando realice la actualización. No es extraño que una aplicación de terceros de la que depende no haya manejado un cambio de TZ correctamente.
Asegúrese de que los relojes de hardware estén configurados en UTC, y si está ejecutando servidores en todo el mundo, asegúrese de que sus sistemas operativos también estén configurados para usar UTC. Esto se hace evidente cuando necesita copiar archivos de registro apache rotados por hora desde servidores en varias zonas horarias. Ordenarlos por nombre de archivo solo funciona si todos los archivos se nombran con la misma zona horaria. También significa que no tienes que hacer cálculos matemáticos en la cabeza cuando pasas de una casilla a otra y necesitas comparar marcas de tiempo.
Además, ejecute ntpd en todos los cuadros.
Clientela
Nunca confíe en la marca de tiempo que obtiene de una máquina cliente como válida. Por ejemplo, la Fecha: encabezados HTTP o una
Date.getTime()
llamada de JavaScript . Estos están bien cuando se usan como identificadores opacos, o cuando se hacen cálculos de fechas durante una sola sesión en el mismo cliente, pero no intente hacer una referencia cruzada de estos valores con algo que tenga en el servidor. Sus clientes no ejecutan NTP, y pueden no tener necesariamente una batería que funcione para su reloj BIOS.Trivialidades
Finalmente, los gobiernos a veces harán cosas muy raras:
Ok, creo que he terminado.
fuente
DateTimeOffset
(o equivalentes) son útiles. De lo contrario, buena redacción.Este es un tema importante y sorprendentemente difícil. La verdad es que no existe un estándar completamente satisfactorio para el tiempo persistente. Por ejemplo, el estándar SQL y el formato ISO (ISO 8601) claramente no son suficientes.
Desde el punto de vista conceptual, generalmente se tratan dos tipos de datos de fecha y hora, y es conveniente distinguirlos (los estándares anteriores no lo hacen): " tiempo físico " y " tiempo civil ".
Un instante de tiempo "físico" es un punto en la línea de tiempo universal continua que la física trata (ignorando la relatividad, por supuesto). Este concepto puede codificarse adecuadamente en UTC, por ejemplo (si puede ignorar los segundos bisiestos).
Un tiempo "civil" es una especificación de fecha y hora que sigue las normas civiles: un punto de tiempo aquí está completamente especificado por un conjunto de campos de fecha y hora (Y, M, D, H, MM, S, FS) más un TZ (especificación de zona horaria) (también un "calendario", en realidad; pero supongamos que restringimos la discusión al calendario gregoriano). Una zona horaria y un calendario permiten conjuntamente (en principio) mapear de una representación a otra. Pero los instantes de tiempo civil y físico son fundamentalmente diferentes tipos de magnitudes, y deben mantenerse conceptualmente separados y tratados de manera diferente (una analogía: conjuntos de bytes y cadenas de caracteres).
El tema es confuso porque hablamos de estos tipos de eventos indistintamente y porque los tiempos civiles están sujetos a cambios políticos. El problema (y la necesidad de distinguir estos conceptos) se vuelve más evidente para los eventos en el futuro. Ejemplo (tomado de mi discusión aquí .
John registra en su calendario un recordatorio para algún evento en fecha
2019-Jul-27, 10:30:00
y hora , TZ =Chile/Santiago
, (que ha compensado GMT-4, por lo tanto, corresponde a UTC2019-Jul-27 14:30:00
). Pero algún día en el futuro, el país decide cambiar la compensación de TZ a GMT-5.Ahora, cuando llegue el día ... si ese recordatorio se dispara a
A)
2019-Jul-27 10:30:00 Chile/Santiago
=UTC time 2019-Jul-27 15:30:00
?o
B)
2019-Jul-27 9:30:00 Chile/Santiago
=UTC time 2019-Jul-27 14:30:00
?No hay una respuesta correcta, a menos que uno sepa a qué se refería John conceptualmente cuando le dijo al calendario "Por favor, llámame
2019-Jul-27, 10:30:00 TZ=Chile/Santiago
".¿Se refería a una "fecha-hora civil" ("cuando los relojes de mi ciudad dan las 10:30")? En ese caso, A) es la respuesta correcta.
¿O quiso decir un "instante físico del tiempo", un punto en la línea continua de tiempo de nuestro universo, por ejemplo, "cuando ocurra el próximo eclipse solar". En ese caso, la respuesta B) es la correcta.
Algunas API de fecha / hora hacen esta distinción correcta: entre ellas, Jodatime , que es la base de la próxima (¡tercera!) API Java DateTime (JSR 310).
fuente
Haga una clara separación arquitectónica de las preocupaciones: para saber exactamente qué nivel interactúa con los usuarios y tiene que cambiar la fecha y hora para / desde la representación canónica (UTC). La fecha y hora no UTC es la presentación (sigue a la zona horaria local de los usuarios), la hora UTC es el modelo (sigue siendo única para los niveles intermedios y de fondo).
Además, decida cuál es su audiencia real, a qué no tiene que servir y dónde traza la línea . No toque calendarios exóticos a menos que realmente tenga clientes importantes allí y luego considere servidores separados orientados al usuario solo para esa región.
Si puede adquirir y mantener la ubicación del usuario, use la ubicación para la conversión sistemática de fecha y hora (por ejemplo, cultura .NET o una tabla SQL), pero proporcione una forma para que el usuario final elija anulaciones si la fecha y hora es crítica para sus usuarios.
Si hay obligaciones de auditoría histórica involucradas (como decir exactamente cuándo Jo en AZ pagó una factura hace 2 años en septiembre), entonces mantenga tanto la hora UTC como la hora local para el registro (sus tablas de conversión cambiarán con el tiempo).
Defina el huso horario referencial de tiempo para los datos que vienen en forma masiva , como archivos, servicios web, etc. Digamos que la compañía de la Costa Este tiene un centro de datos en CA: debe preguntar y saber qué usan como estándar en lugar de asumir uno u otro.
No confíe en las compensaciones de zona horaria incrustadas en la representación textual de la fecha y hora y no acepte analizarlas y seguirlas. En su lugar, solicite siempre que la zona horaria y / o la zona de referencia tengan que definirse explícitamente . Puede recibir fácilmente el tiempo con desplazamiento PST, pero el tiempo es en realidad EST ya que es el tiempo de referencia del cliente y los registros se exportaron a un servidor que está en PST.
fuente
Debeconocer la base de datos Olson tz , que está disponible enftp://elsie.nci.nih.gov/pubhttp://iana.org/time-zones/ . Se actualiza varias veces al año para hacer frente a los cambios a menudo de última hora en cuándo (y si) cambiar entre el invierno y el verano (horario estándar y horario de verano) en diferentes países del mundo. En 2009, el último lanzamiento fue 2009; en 2010, fue 2010n; en 2011, fue 2011n; a finales de mayo de 2012, el lanzamiento fue 2012c. Tenga en cuenta que hay un conjunto de códigos para administrar los datos y los datos de la zona horaria en sí, en dos archivos separados (tzcode20xxy.tar.gz y tzdata20xxy.tar.gz). Tanto el código como los datos son de dominio público.Esta es la fuente de nombres de zonas horarias como América / Los_Angeles (y sinónimos como Estados Unidos / Pacífico).
Si necesita realizar un seguimiento de diferentes zonas, entonces necesita la base de datos Olson. Como otros han aconsejado, también desea almacenar los datos en un formato fijo (UTC es normalmente el elegido) junto con un registro de la zona horaria en la que se generaron los datos. Es posible que desee distinguir entre el desplazamiento de UTC en el momento y el nombre de la zona horaria; eso puede hacer la diferencia más tarde. Además, sabiendo que actualmente es 2010-03-28T23: 47: 00-07: 00 (EE. UU. / Pacífico) puede o no ayudarlo a interpretar el valor 2010-11-15T12: 30, que presumiblemente se especifica en PST ( Hora estándar del Pacífico) en lugar de PDT (hora de verano del Pacífico).
Las interfaces estándar de la biblioteca C no son terriblemente útiles con este tipo de cosas.
Los datos de Olson se han movido, en parte porque AD Olson se retirará pronto, y en parte porque hubo una demanda (ahora desestimada) contra los mantenedores por infracción de derechos de autor. La base de datos de zonas horarias ahora se administra bajo los auspicios de IANA , la Autoridad de Números Asignados de Internet, y hay un enlace en la página principal a 'Base de datos de zonas horarias' . La lista de correo de discusión es ahora
[email protected]
; La lista de anuncios es[email protected]
.fuente
zic.8
página del manual (ozic.8.txt
). Necesitará eltzcode2011i.tar.gz
archivo en lugar de, o también, eltzdata2011i.tar.gz
archivo para obtener esta información.En general, incluya el desplazamiento de hora local (incluido el desplazamiento de DST) en las marcas de tiempo almacenadas: UTC por sí solo no es suficiente si luego desea mostrar la marca de tiempo en su zona horaria original (y la configuración de DST).
Tenga en cuenta que el desplazamiento no siempre es un número entero de horas (por ejemplo, la hora estándar de la India es UTC + 05: 30).
Por ejemplo, los formatos adecuados son una tupla (tiempo unix, desplazamiento en minutos) o ISO 8601 .
fuente
Cruzar la frontera del "tiempo de la computadora" y el "tiempo de la gente" es una pesadilla. La principal es que no hay ningún tipo de estándar para las reglas que rigen las zonas horarias y los horarios de verano. Los países son libres de cambiar sus reglas de zona horaria y horario de verano en cualquier momento, y lo hacen.
Algunos países, como Israel, Brasil, deciden cada año cuándo tener su horario de verano, por lo que es imposible saber de antemano cuándo (si) estará vigente el horario de verano. Otros tienen reglas fijas (ish) sobre cuándo está vigente el horario de verano. Otros países no usan DST como todos.
Las zonas horarias no tienen que ser diferencias de hora completa de GMT. Nepal es +5.45. Incluso hay zonas horarias que son +13. Eso significa que:
son todos al mismo tiempo, ¡pero 3 días diferentes!
Tampoco hay un estándar claro sobre las abreviaturas para las zonas horarias y cómo cambian cuando están en horario de verano, por lo que terminas con cosas como esta:
El mejor consejo es mantenerse alejado de la hora local tanto como sea posible y apegarse a UTC donde pueda. Solo convierta a horas locales en el último momento posible.
Cuando realice la prueba, asegúrese de probar países en los hemisferios occidental y oriental, con DST en progreso y no, y un país que no utiliza DST (6 en total).
fuente
Para PHP:
La clase DateTimeZone en PHP> 5.2 ya se basa en la base de datos Olson que otros mencionan, por lo que si está haciendo conversiones de zona horaria en PHP y no en la base de datos, está exento de trabajar con archivos Olson (difíciles de entender).
Sin embargo, PHP no se actualiza con tanta frecuencia como el Olson DB, por lo que el simple uso de conversiones de zona horaria de PHP puede dejarle información DST desactualizada e influir en la exactitud de sus datos. Si bien esto no se espera que ocurra con frecuencia, puede ocurrir, y le sucedería si usted tiene una gran base de usuarios en todo el mundo.
Para hacer frente al problema anterior, use el paquete timezonedb pecl . Su función es actualizar los datos de zona horaria de PHP. Instale este paquete con la frecuencia que se actualiza. (No estoy seguro de si las actualizaciones de este paquete siguen exactamente las actualizaciones de Olson, pero parece que se actualiza a una frecuencia que es al menos muy cercana a la frecuencia de las actualizaciones de Olson).
fuente
Si su diseño puede acomodarlo, ¡ evite la conversión de hora local todos juntos!
Sé que esto puede parecer una locura, pero piense en UX: los usuarios procesan fechas cercanas, relativas (hoy, ayer, el próximo lunes) más rápido que las fechas absolutas (2010.09.17, viernes 17 de septiembre) de un vistazo. Y cuando lo piensa más, la precisión de las zonas horarias (y DST) es más importante cuanto más cerca esté la fecha
now()
, por lo que si puede expresar fechas / horas en un formato relativo durante +/- 1 o 2 semanas, el resto de las fechas pueden ser UTC y no le importará demasiado al 95% de los usuarios.De esta manera, puede almacenar todas las fechas en UTC y hacer las comparaciones relativas en UTC y simplemente mostrar las fechas UTC del usuario fuera de su umbral de fecha relativa.
Esto también puede aplicarse a la entrada del usuario (pero generalmente de una manera más limitada). Seleccionar de un menú desplegable que solo tiene {Ayer, Hoy, Mañana, Próximo lunes, Próximo jueves} es mucho más simple y fácil para el usuario que un selector de fecha. Los recolectores de fechas son algunos de los componentes más inductores de dolor del llenado de formularios. Por supuesto, esto no funcionará en todos los casos, pero puede ver que solo se necesita un diseño inteligente para que sea muy potente.
fuente
Si bien no lo he intentado, un enfoque para los ajustes de zona horaria que me resultaría convincente sería el siguiente:
Almacene todo en UTC.
Cree una tabla
TZOffsets
con tres columnas: RegionClassId, StartDateTime y OffsetMinutes (int, en minutos).En la tabla, almacene una lista de fechas y horas en que cambió la hora local y en qué medida. El número de regiones en la tabla y el número de fechas dependerán del rango de fechas y áreas del mundo que necesite admitir. Piense en esto como si fuera una fecha "histórica", aunque las fechas deberían incluir el futuro hasta cierto límite práctico.
Cuando necesite calcular la hora local de cualquier hora UTC, simplemente haga esto:
Es posible que desee almacenar en caché esta tabla en su aplicación y usar LINQ o algún otro medio similar para hacer las consultas en lugar de golpear la base de datos.
Estos datos se pueden destilar de la base de datos de dominio público tz .
Ventajas y notas al pie de este enfoque:
Ahora, la única desventaja de este enfoque o de cualquier otro es que las conversiones de la hora local a GMT no son perfectas, ya que cualquier cambio de horario de verano que tenga un desplazamiento negativo en el reloj repite una hora local determinada. Me temo que no es una forma fácil de lidiar con eso, que es una de las razones por las que almacenar las horas locales es una mala noticia en primer lugar.
fuente
Recientemente tuve un problema en una aplicación web en la que en una devolución de datos Ajax la fecha y hora que volvía a mi código del lado del servidor era diferente de la fecha y hora servida.
Lo más probable es que tuviera que ver con mi código JavaScript en el cliente que creó la fecha para volver a publicar en el cliente como cadena, porque JavaScript se estaba ajustando para la zona horaria y el horario de verano, y en algunos navegadores el cálculo de cuándo aplicar el horario de verano Parecía ser diferente que en otros.
Al final, opté por eliminar por completo los cálculos de fecha y hora en el cliente, y los publiqué en mi servidor en una clave entera que luego se tradujo a la hora en el servidor, para permitir transformaciones consistentes.
Aprendí de esto: no use cálculos de fecha y hora de JavaScript en aplicaciones web a menos que sea ABSOLUTAMENTE necesario.
fuente
He tocado esto en dos tipos de sistemas, "sistemas de planificación de turnos (por ejemplo, trabajadores de fábricas)" y "sistemas de gestión dependientes del gas) ...
Los días de 23 y 25 horas son difíciles de manejar, al igual que los turnos de 8 horas que duran 7 horas o 9 horas. El problema es que encontrará que cada cliente, o incluso el departamento del cliente, tienen reglas diferentes que han creado (a menudo sin documentar) sobre lo que hacen en estos casos especiales.
Es mejor no hacer algunas preguntas a los clientes hasta que hayan pagado su software "listo para usar". Es muy raro encontrar un cliente que piense en este tipo de problema por adelantado al comprar software.
Creo que, en todos los casos, debe registrar la hora en UTC y convertirla a / desde la hora local antes de almacenar la fecha / hora. Sin embargo, incluso saber en qué momento se encuentra un tiempo determinado puede ser difícil con el horario de verano y las zonas horarias.
fuente
Para la web, las reglas no son tan complicadas ...
El resto es solo conversión UTC / local utilizando las bibliotecas de fecha y hora del lado del servidor. Bueno para ir...
fuente
Cuando se trata de aplicaciones que se ejecutan en un servidor , incluidos sitios web y otros servicios de fondo, la aplicación debe ignorar la configuración de zona horaria del servidor.
El consejo común es configurar la zona horaria del servidor en UTC. De hecho, esta es una buena práctica recomendada, pero está ahí como una curita para aplicaciones que no siguen otras prácticas recomendadas. Por ejemplo, un servicio podría estar escribiendo en archivos de registro con marcas de tiempo locales en lugar de marcas de tiempo basadas en UTC, creando así ambigüedades durante la transición de retroceso del horario de verano. Establecer la zona horaria del servidor en UTC corregirá esa aplicación. Sin embargo, la solución real sería que la aplicación inicie sesión con UTC para empezar.
El código del lado del servidor, incluidos los sitios web, nunca debe esperar que la zona horaria local del servidor sea algo en particular.
En algunos idiomas, la zona horaria local puede introducirse fácilmente en el código de la aplicación. Por ejemplo, el
DateTime.ToUniversalTime
método en .NET se convertirá desde la zona horaria local a UTC, y laDateTime.Now
propiedad devuelve la hora actual en la zona horaria local. Además, elDate
constructor en JavaScript utiliza la zona horaria local de la computadora. Hay muchos otros ejemplos como este. Es importante practicar la programación defensiva, evitando cualquier código que use la configuración de zona horaria local de la computadora.Reserve utilizando la zona horaria local para el código del lado del cliente, como aplicaciones de escritorio, aplicaciones móviles y JavaScript del lado del cliente.
fuente
Mantenga sus servidores configurados en UTC y asegúrese de que todos estén configurados para ntp o su equivalente.
UTC evita los problemas de horario de verano, y los servidores no sincronizados pueden causar resultados impredecibles que tardan un tiempo en diagnosticarse.
fuente
Tenga cuidado al tratar con marcas de tiempo almacenadas en el sistema de archivos FAT32: siempre se conserva en las coordenadas de hora local (que incluyen DST; consulte el artículo de msdn ). Me quemé con eso.
fuente
Otra cosa, asegúrese de que los servidores tengan aplicado el parche actualizado de horario de verano.
Tuvimos una situación el año pasado en la que nuestros tiempos estuvieron constantemente fuera de una hora por un período de tres semanas para los usuarios de América del Norte, a pesar de que estábamos usando un sistema basado en UTC.
Resulta que al final fueron los servidores. Solo necesitaban un parche actualizado aplicado ( Windows Server 2003 ).
fuente
DateTimeZone::listAbbreviations()
Salida de PHPEste método PHP devuelve una matriz asociativa que contiene algunas zonas horarias 'principales' (como CEST), que por sí mismas contienen zonas horarias 'geográficas' más específicas (como Europa / Amsterdam).
Si está utilizando estas zonas horarias y su información de desplazamiento / DST, es extremadamente importante tener en cuenta lo siguiente:
¡Parece que se incluyen todas las diferentes configuraciones de desplazamiento / DST (incluidas las configuraciones históricas) de cada zona horaria!
Por ejemplo, Europa / Amsterdam se puede encontrar seis veces en la salida de esta función. Dos ocurrencias (desplazamiento 1172/4772) son para el tiempo de Amsterdam utilizado hasta 1937; dos (1200/4800) son para el tiempo que se usó entre 1937 y 1940; y dos (3600/4800) son para el tiempo utilizado desde 1940.
Por lo tanto, no puede confiar en que la información de desplazamiento / DST devuelta por esta función sea actualmente correcta / en uso.
Si desea conocer el desplazamiento / DST actual de una determinada zona horaria, deberá hacer algo como esto:
fuente
Si tiene sistemas de bases de datos que se ejecutan con DST activo, verifique cuidadosamente si deben cerrarse durante la transición en otoño. A Mandy DBS (u otros sistemas también) no le gusta pasar el mismo punto en el tiempo (local) dos veces, que es exactamente lo que sucede cuando retrocede el reloj en otoño. SAP ha resuelto esto con una solución alternativa (en mi humilde opinión): en lugar de hacer retroceder el reloj, simplemente dejan que el reloj interno funcione a la mitad de la velocidad habitual durante dos horas ...
fuente
¿Estás usando el framework .NET ? Si es así, permítame presentarle el tipo DateTimeOffset , agregado con .NET 3.5.
Esta estructura contiene tanto a
DateTime
como un Offset (TimeSpan
), que especifica la diferencia entre laDateTimeOffset
fecha y la hora de la instancia y la hora universal coordinada (UTC).El
DateTimeOffset.Now
método estático devolverá unaDateTimeOffset
instancia que consta de la hora actual (local) y el desplazamiento local (como se define en la información regional del sistema operativo).El
DateTimeOffset.UtcNow
método estático devolverá unaDateTimeOffset
instancia que consta de la hora actual en UTC (como si estuviera en Greenwich).Otros tipos útiles son las clases TimeZone y TimeZoneInfo .
fuente
Para aquellos que luchan con esto en .NET , vea si vale la pena usar
DateTimeOffset
y / oTimeZoneInfo
.Si desea utilizar las zonas horarias de IANA / Olson , o si los tipos integrados no son suficientes para sus necesidades, consulte Noda Time , que ofrece una API de fecha y hora mucho más inteligente para .NET.
fuente
Las reglas comerciales siempre deben funcionar en tiempo civil (a menos que haya una legislación que diga lo contrario). Tenga en cuenta que el tiempo civil es un desastre, pero es lo que la gente usa, así que es lo importante.
Internamente, mantenga las marcas de tiempo en algo como civil-time-segundos-de-época. La época no importa particularmente (estoy a favor de la época de Unix ) pero hace las cosas más fáciles que la alternativa. Imagina que los segundos de salto no existen a menos que estés haciendo algo que realmente los necesite (por ejemplo, seguimiento satelital). La asignación entre las marcas de tiempo y la hora mostrada es el único punto donde se deben aplicar las reglas DST ; las reglas cambian con frecuencia (a nivel global, varias veces al año; culpe a los políticos), por lo que debe asegurarse de no codificar el mapeo. La base de datos TZ de Olson es invaluable.
fuente
Solo quería señalar dos cosas que parecen inexactas o al menos confusas:
Para (casi) todos los propósitos prácticos de computación, UTC es, de hecho, GMT. A menos que vea una marca de tiempo con un segundo fraccional, está tratando con GMT, lo que hace que esta distinción sea redundante.
Una marca de tiempo siempre se representa en GMT y, por lo tanto, no tiene desplazamiento.
fuente
Aquí está mi experiencia: -
(No requiere ninguna biblioteca de terceros)
fuente
getTimezoneOffset
devuelve el desplazamiento de la fecha y hora en que lo llama. Ese desplazamiento puede cambiar cuando una zona horaria cambia dentro o fuera del horario de verano. Consulte "zona horaria! = Desplazamiento" en la wiki de etiqueta de zona horaria .El video de Tom Scott sobre zonas horarias en YouTube en el canal Computerphile también tiene una descripción agradable y entretenida del tema. Ejemplos incluyen:
fuente
En realidad, kernel32.dll no exporta SystemTimeToTzSpecificLocation. Sin embargo, exporta los dos siguientes: SystemTimeToTzSpecificLocalTime y TzSpecificLocalTimeToSystemTime ...
fuente
Nunca confíes solo en constructores como
Pueden lanzar excepciones cuando no existe una fecha y hora determinada debido al horario de verano. En cambio, cree sus propios métodos para crear tales fechas. En ellos, detecte cualquier excepción que ocurra debido al horario de verano y ajuste el tiempo necesario con el desplazamiento de transición. El horario de verano puede ocurrir en diferentes fechas y a diferentes horas (incluso a medianoche para Brasil) según la zona horaria.
fuente
Solo un ejemplo para demostrar que el tiempo de manejo es el gran desastre descrito, y que nunca puedes ser complaciente. En varios puntos de esta página se han ignorado los segundos bisiestos.
Hace varios años, el sistema operativo Android usaba satélites GPS para obtener una referencia de tiempo UTC, pero ignoraba el hecho de que los satélites GPS no usan segundos intercalares. Nadie se dio cuenta hasta que hubo confusión en la víspera de Año Nuevo, cuando los usuarios de teléfonos Apple y Android hicieron sus cuentas regresivas con aproximadamente 15 segundos de diferencia.
Creo que desde entonces se ha solucionado, pero nunca se sabe cuándo estos 'detalles menores' volverán a atormentarte.
fuente
struct tm
en C.¹¹ Algunas implementaciones de
struct tm
sí almacenan el desplazamiento UTC, pero esto no lo ha convertido en el estándar.fuente
Al tratar con bases de datos (en particular MySQL , pero esto se aplica a la mayoría de las bases de datos), me resultó difícil almacenar UTC.
Me resultó más fácil simplemente almacenar la fecha y hora del servidor en la base de datos, luego dejar que la base de datos convierta la fecha y hora almacenada nuevamente a UTC (es decir, UNIX_TIMESTAMP ()) en las instrucciones SQL. Después de eso, puede usar la fecha y hora como UTC en su código.
Si tiene el 100% de control sobre el servidor y todo el código, probablemente sea mejor cambiar la zona horaria del servidor a UTC.
fuente