Grandamakulo   15-06-2023, 16:49
#1
Hola, compañeros:
Lo del asunto, o sea, quisiera obtener para una localización dada —zona horaria— y en un momento dado por una fecha en formato DATA y TIME, con la base de datos «textual» tzdata la diferencia entre la hora oficial y el UTC. Si no con DATA y TIME, podría valer cualquier otra datación continua, como el día juliano. Hay varias librerías por ahí en PASCAL o C, pero soy un torpe incapaz de pasarlo a GAMBAS3.
Ojo, para el momento actual en el bicho u PC actual es bastante fácil: System.TimeZone

En: https://en.wikipedia.org/wiki/Tz_database , en el apartado «Use in software systems» hay implementación en varios lenguajes. Pero, insisto, mi torpeza me hace incapaz de traducirlo.

Un saludo y gracias de antemano.

PS.—https://www.iana.org/time-zones
Última modificación: 15-06-2023, 17:20 por Grandamakulo.

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
tincho   15-06-2023, 22:15
#2
Probaste poner en la terminal date --help ? Ese comando tiene un montón de opciones de salida.

Para mas claridad, pone un ejemplo de lo que querés obtener (literalmente) y de lo que querés proporcionarle a la "función" para que te devuelva eso que buscas.
Última modificación: 15-06-2023, 22:32 por tincho.

1 Saludo.
Grandamakulo   16-06-2023, 11:26
#3
¡Muchas gracias por tu rápida respuesta!
(15-06-2023, 22:15)tincho escribió: Probaste poner en la terminal date --help ? Ese comando tiene un montón de opciones de salida.

Sí, incluso el uso de alguna librería astronómica perdida por ahí, pero me gustaría, si es posible, no tener que llamar a algo externo.
(15-06-2023, 22:15)tincho escribió: Para mas claridad, pone un ejemplo de lo que querés obtener (literalmente) y de lo que querés proporcionarle a la "función" para que te devuelva eso que buscas.

¡Claro!
Código:
Public Function Dif_HL_UTC(sZonaHoraria As String, fJD As Float) As Single
'**** Cálculo de la diferencia entre la hora local (HL) y el tiempo universal
' coordinado (UTC) a partir de una zona horaria y un tiempo secuencial, JD.
'<<<< sngDif Diferencia entre hora local y UTC en horas entre -12 y +12. ¡Ojo!,
' que puede ser una fracción.
'>>>> fJD: Día juliano, número de días transcurridos de manera secuencial desde
' el 1 de enero de -4712. Puede valer cualquier otro secuencial, como el
' número de segundos UNIX —tipo de datos DATE—.
'>>>> sZonaHoraria: cadena que indica la zona horaria en formato tzdata, por
' ejemplo: "Europa/Madrid", "America/Buenos_Aires"

Dim sngDif As Single

''Código: Aquí ocurren cosas maravillosas con tzdata.

Return sngDif

End

Por ejemplo, para fJD = 2458341.5 —11 de agosto de 2018— y sZonaHoraria = "Africa/Ceuta" resulta que Dif_HL_UTC = +2, ya que HL = UTC + 2; no sé si ha quedado claro, a pesar de mi natural farragosidad.

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
vuott   18-06-2023, 02:32
#4
(15-06-2023, 16:49)Grandamakulo escribió: En: https://en.wikipedia.org/wiki/Tz_database , en el apartado «Use in software systems» hay implementación en varios lenguajes.
Aquí utilizando la librería externa GLib, mencionada en el enlace que has citado:
Código:
' Gambas module file

Library "libglib-2.0:0.7200.4"

Private Enum G_TIME_TYPE_STANDARD = 0, G_TIME_TYPE_DAYLIGHT, G_TIME_TYPE_UNIVERSAL

' GTimeZone ° g_time_zone_new_identifier(const gchar °identifier)
' Creates a GTimeZone corresponding to identifier.
Private Extern g_time_zone_new_identifier(identifier As String) As Pointer

' gint g_time_zone_find_interval(GTimeZone *tz, GTimeType type, gint64 time_)
' Find an interval within tz that corresponds to given time_.
Private Extern g_time_zone_find_interval(tz As Pointer, type As Integer, time_ As Long) As Integer

' gint32 g_time_zone_get_offset(GTimeZone *tz, gint interval)
' Determines the offset to UTC.
Private Extern g_time_zone_get_offset(tz As Pointer, interval As Integer) As Integer

' void g_time_zone_unref(GTimeZone *tz)
' Decreases the reference count on tz.
Private Extern g_time_zone_unref(tz As Pointer)


Public Sub Main()

  Dim timezone As String
  Dim gtz As Pointer
  Dim itv, off As Integer
 
  timezone = Replace(File.Load("/etc/timezone"), gb.NewLine, "\x00")
 
  gtz = g_time_zone_new_identifier(timezone)
  If gtz == 0 Then Error.Raise("Errore !")
 
  itv = g_time_zone_find_interval(gtz, G_TIME_TYPE_STANDARD, DateDiff(CDate("01/01/1970 00:00:00"), Now, gb.Second))
 
  off = g_time_zone_get_offset(gtz, itv)
  Print off; " = "; Time(0, 0, 0, off * 1000)
 
  g_time_zone_unref(gtz)
 
End
Sinceramente Confused no veo la ventaja respecto a System.TimeZone.
Última modificación: 19-06-2023, 10:09 por vuott.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
Grandamakulo   22-06-2023, 13:13
#5
Hola, @vuott:
He estado analizando lo que me propones. Lo primero, que trataba de montarlo sin funciones externas. Lo segundo, en definitiva, aunque tu solución es mucho más elegante, es básicamente lo que ya hacía con distintas librerías.
Y en cuanto a System.Timezone, claro, funciona genial, pero sólo para este momento y para este equipo. Yo necesito que, en función de la zona horaria que se proponga, no la del equipo, y para el momento propuesto, no para el tiempo del equipo.
En cualquier caso, grazie mille per tutto

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
vuott   22-06-2023, 14:33
#6
(22-06-2023, 13:13)Grandamakulo escribió: en cuanto a System.Timezone, claro, funciona genial, pero sólo para este momento y para este equipo. Yo necesito que, en función de la zona horaria que se proponga, no la del equipo
Ah, entiendo.
Bueno, en ese caso mi solución con recursos externos de GLIB puede ayudarte.
De hecho, tú puedes establecer el nombre de la zona horaria, que quieras, en la función "g_time_zone_new_identifier()".



(22-06-2023, 13:13)Grandamakulo escribió: grazie mille per tutto
È stato un piacere e molto interessante aiutarti.
Ciao.
Última modificación: 22-06-2023, 14:54 por vuott.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
  
Usuarios navegando en este tema: 2 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.