Convertir Una Fecha-hora De Hora UTC A Hora Local


Objetivo: Convertir Una Fecha-hora De Hora UTC A Hora Local
Ante todo, Feliz Navidad a todos.

Me encuentro con problema que no sé si es que estoy bloqueado, pero no encuentro la forma de resolverlo. El caso es que me llega un fichero con fechas-horas en UTC y las tengo que convertir a hora local.

Según la especificación, el formato de la de la fecha-hora sigue la norma ISO8601, es decir, yyyy-mm-ddThh:mm:ssZ
(por ejemplo: 2012-06-17T06:34:53Z)

¿Como puedo convertirla a hora local? El caso del ejemplo, tengo que mostrar por pantalla 17-06-2012 08:34:53 ya que estamos en horario de verano y son 2 horas más.

He visto ejemplos de como obtener la hora UTC actual con date -u directamente del sistema operativo. No sé si la solución puede ir por el mismo camino.

Gracias por las respuestas.

Perfil MP  
Objetivo: Re: Convertir Una Fecha-hora De Hora UTC A Hora Local
gatoviejo:

Citar:

¿Como puedo convertirla a hora local? El caso del ejemplo, tengo que mostrar por pantalla 17-06-2012 08:34:53


A ver si te sirve asi:
Citar:

print format(now,"dd-mm-yyyy hh:nn:ss")

Mirate el comando format para ver más opciones http://gambasdoc.org/help/cat/userformat?es&v3

Saludos

Objetivo: Re: Convertir Una Fecha-hora De Hora UTC A Hora Local
Veo que no me he sabido explicar. Me llega un fecha-hora en hora UTC (hora solar, hora de Greenwhich, hora GMT u hora zulú, tiene diversas denominaciones) y lo tengo que convertir a hora local, que en España es +1 hora en invierno y +2 horas en verano.
La fecha puede ser cualquiera, por lo que no sirve la diferencia dada por la propiedad System.TimeZone de gambas, por ejemplo, ya que es la diferencia del momento, no de cualquier fecha.

La referencia que tengo es la función convert_tz de mysql:
Citar:
convert_tz('2013-08-24 13:14:23', 'UTC', 'Europe/Madrid')
2013-08-24 15:14:23

convert_tz('2013-11-24 13:14:23', 'UTC', 'Europe/Madrid')
2013-11-24 14:14:23


Luego, la visualización sí se puede hacer con el comando format.

Perfil MP  
Objetivo: Re: Convertir Una Fecha-hora De Hora UTC A Hora Local
Vale, entonces lo que te tienes que crear es la funcion que haga que añada las horas segun sea horario de verano o de invierno. Algo asi como esto:

Public Function cambioTZ(fechaGreenWhich As Date) As Date

Dim fecha As Date

If Format$(fechaGreenWhich, "mmddnn") > "033002" And Format$(fechaGreenWhich, "mmddnn") < "102703" Then
'horario verano: suma +2 hora
fecha = DateAdd(fechaGreenWhich, gb.Hour, 2)
Else
'horario invierno: suma +1 hora
fecha = DateAdd(fechaGreenWhich, gb.Hour, 1)

Endif
Return fecha

End


Nota:
033002: significa el mes de marzo dia 30, a las 02:00 horas
102703: significa el mes de octubrre dia 27, a las 03:00 horas.
Asi averiguo si estoy en "verano" o "invierno".
Comprueba si asi se convierten todas las horas bien..

Y usala en tu programa

Public Sub Form_Open()

Dim fechaW As Date

fechaW = Date(2013, 8, 24, 13, 14, 23)

Print "Fecha GreenWich:", Format$(fechaW, "dd-mm-yyyy hh:nn:ss")

Print "Fecha Madrid:", Format$(cambioTZ(fechaW), "dd-mm-yyyy hh:nn:ss")

fechaW = Date(2013, 11, 24, 13, 14, 23)

Print "Fecha GreenWich:", Format$(fechaW, "dd-mm-yyyy hh:nn:ss")

Print "Fecha Madrid:", Format$(cambioTZ(fechaW), "dd-mm-yyyy hh:nn:ss")

End



Este programita genera en consola esto:
Fecha GreenWich: 24-08-2013 13:14:23
Fecha Madrid: 24-08-2013 15:14:23
Fecha GreenWich: 24-11-2013 13:14:23
Fecha Madrid: 24-11-2013 14:14:23

Objetivo: [SOLUCIONADO] Re: Convertir Una Fecha-hora De Hora UTC A Hora Local
Muchas gracias por poner hasta la rutina, la verdad es que no me esperaba tanto. Lo que pretendía era saber si había alguna función nativa que lo hiciera; no había encontrado ninguna y tampoco me sonaba nada por sistema operativo, aunque la información existe (/usr/share/zoneinfo) de la que se alimenta mysql.

Para completar la rutina de jsbsan, se tendría que añadir que el cambio se hiciera el último domingo del año. Para calcularlo se puede utilizar:
Public Function UltimoDomingoMes(Anyo As Integer, Mes As Integer) As Date
Dim Fecha As Date

Fecha = Val("01/" & Mes & "/" & anyo)

Return DateAdd(Fecha, gb.Day, - WeekDay(Fecha)
End


Con esto para mis necesidades es suficiente, pero si alguien quiere realizar una rutina más genérica tiene que tener en cuenta que el cambio de hora está regulado por ley y por lo tanto puede cambiar. En el presente está regulado por la directiva europea 2000/84 que es la que establece que el último domingo de marzo a las 02:00h se adelanta una hora y el último domingo de octubre a las 03:00h se retrasa una hora. Esto se revisa cada 5 años, por lo que en un futuro puede cambiar.

Además hay que tener en cuenta que no siempre ha sido así ni mucho menos:
Por geografía, España está en el huso horario de Greenwhich (de hecho, el meridiano pasa cerca de Castellón) y deberíamos tener la misma hora que Gran Bretaña y Portugal, pero por decisión política del año 1940, pasamos a tener la hora de Europa Central. Últimamente en el Congreso español se ha debatido si deberíamos volver al horario natural o no.
Por otro lado, el cambio de hora en verano se aplica en España desde 1974, pero el cambio se producía en marzo y septiembre y en el año 1996 se cambió al actual de marzo-octubre.

Como podéis ver, si alguien tiene un necesidad que abarque un periodo de tiempo más o menos grande del pasado, la rutina se puede complicar todo lo que se quiera.

Saludos

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.4095s (PHP: -79% SQL: 179%)
Consultas SQL: 44 - Debug off - GZIP Activado