Hola
Con el cambio de hora, $datim retrocede en el tiempo.
Tenemos un servicio que se ejecuta en el servidor y que registra la hora usando $datim. Nos encontramos con que con el cambio de hora, ha recorrido el periodo de 2:00am-3:00am dos veces.
Hay forma de corregir esto?. Vi que existe $nlstimezone pero no lo hemos usado nunca.
gracias
Husos horarios
Re: Husos horarios
Hola
Existen una serie de funciones/parametrizaciones que permiten resolver esas situaciones. Por defecto, $datim y demás, devuelven la hora del ordenador donde se ejecutan. No es un tema trivial y se ve afectado por el cambio de hora pero también cuando usuarios de diferentes husos horarios colaboran dentro de la aplicación (este evento ha ocurrido a las 9:00 ¿tus 9:00 o mis 9:00?).
$nlstimezone y $NLS_TIME_ZONE permiten definir el huso horario a utilizar al mostrar los datos al usuario. Lo lógico es utilizar el huso horario definido en el propio ordenador del usuario. Ése es el comportamiento por defecto.
Por otro lado, está el tándem $nlsinternaltime y $NLS_INTERNAL_TIME que definen el huso horario a utilizar internamente. Qué huso horario utilizar al guardar el dato en base de datos.
Por ejemplo, se puede especificar que siempre se muestre la hora local al usuario pero se guarde la hora del meridiano de Greenwich.
En vuestro caso, podríais definir en el ASN $NLS_INTERNAL_TIME = UTC, o cambiarlo en el propio servicio $nlsinternaltime = "UTC". O hacer algo como esto:
Es importante reseñar que esa conversión también aplica cuando se exportan/importan datos con XML. Ya sea porque un servicio es publicado como webservice o se llama a un webservice externo, o porque se ejecuta un xmlsave o structtoxml... el dato timestamp es convertido de huso horario usando estas parametrizaciones.
Interesante: https://www.youtube.com/watch?v=-5wpm-gesOY
Humor: https://www.youtube.com/watch?v=poQ2eYgRSEY (explicación si no recibiste educación en España. Los mapas de geografía de los colegios en España siempre representan a las islas Canarias dentro de un recuadro al sureste de la península Ibérica cuando realmente están a unos 1000km al suroeste. El que habla fue Ministro)
Existen una serie de funciones/parametrizaciones que permiten resolver esas situaciones. Por defecto, $datim y demás, devuelven la hora del ordenador donde se ejecutan. No es un tema trivial y se ve afectado por el cambio de hora pero también cuando usuarios de diferentes husos horarios colaboran dentro de la aplicación (este evento ha ocurrido a las 9:00 ¿tus 9:00 o mis 9:00?).
$nlstimezone y $NLS_TIME_ZONE permiten definir el huso horario a utilizar al mostrar los datos al usuario. Lo lógico es utilizar el huso horario definido en el propio ordenador del usuario. Ése es el comportamiento por defecto.
Por otro lado, está el tándem $nlsinternaltime y $NLS_INTERNAL_TIME que definen el huso horario a utilizar internamente. Qué huso horario utilizar al guardar el dato en base de datos.
Por ejemplo, se puede especificar que siempre se muestre la hora local al usuario pero se guarde la hora del meridiano de Greenwich.
En vuestro caso, podríais definir en el ASN $NLS_INTERNAL_TIME = UTC, o cambiarlo en el propio servicio $nlsinternaltime = "UTC". O hacer algo como esto:
Code: Select all
;se pasa a hora zulú
VCZONE = $nlstimezone
$nlstimezone = "zulu"
;$datim devolverá siempre la hora del meridiano de Greenwich (+00:00)
;se restaura el huso horario anterior para que no afecte a otros servicios
$nlstimezone = VCZONE
Es importante reseñar que esa conversión también aplica cuando se exportan/importan datos con XML. Ya sea porque un servicio es publicado como webservice o se llama a un webservice externo, o porque se ejecuta un xmlsave o structtoxml... el dato timestamp es convertido de huso horario usando estas parametrizaciones.
Interesante: https://www.youtube.com/watch?v=-5wpm-gesOY
Humor: https://www.youtube.com/watch?v=poQ2eYgRSEY (explicación si no recibiste educación en España. Los mapas de geografía de los colegios en España siempre representan a las islas Canarias dentro de un recuadro al sureste de la península Ibérica cuando realmente están a unos 1000km al suroeste. El que habla fue Ministro)
$status=0 ; se acabaron los problemas