Convertir Fecha Uso horario a Fecha-hora

Post Reply
FiveWiDi
Posts: 1467
Joined: Mon Oct 10, 2005 2:38 pm

Convertir Fecha Uso horario a Fecha-hora

Post by FiveWiDi »

Hola a todos,

Sabes Ustedes si existe alguna función que convierta una fecha-hora de uso horario en fecha-hora 'solar''?

Es decir, convertir 2025-11-04T00:13:36+01:00 en 2025-11-03T23:13:36.

Muchas gracias,

Un Saludo
Carlos G.

FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

User avatar
Antonio Linares
Site Admin
Posts: 44515
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Convertir Fecha Uso horario a Fecha-hora

Post by Antonio Linares »

regards, saludos

Antonio Linares
www.fivetechsoft.com
FiveWiDi
Posts: 1467
Joined: Mon Oct 10, 2005 2:38 pm

Re: Convertir Fecha Uso horario a Fecha-hora

Post by FiveWiDi »

Antonio Linares wrote: Wed Nov 12, 2025 12:18 am

Estimado Carlos,

https://deepwiki.com/search/existe-algu ... ?mode=fast

Buenos días Antonio,

Perdona pero no lo consigo.

He buscado en el foro, pero no encuentro la respuesta.

He probado esto:
Error description: Error BASE/3012 Error de argumento: HB_TSTOUTC
Args:
[ 1] = C 2025-11-04T00:13:36+01:00

También esto:
hb_timeStampStrGetUTC( "2025-11-04T00:13:36+01:00" )

Unresolved external '_HB_FUN_HB_TIMESTAMPSTRGETUTC' referenced from

No sé interpretar el código 'C' que ha respondido la consulta, y no se qué LIB enlazar.

Un Saludo
Carlos G.

FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

User avatar
AngelSalom
Posts: 730
Joined: Fri Oct 07, 2005 7:38 am
Location: Benicarló (Castellón ) - España
Contact:

Re: Convertir Fecha Uso horario a Fecha-hora

Post by AngelSalom »

Quizás te sirva

Code: Select all | Expand

FUNCTION ISO8601ToLocal( cFechaISO )
   LOCAL cFecha, cHora, cSigno, nHoras, nMinutos, nOffset, dFecha, dLocal, cResult
   LOCAL nHour, nMin, nSecOnly, nFrac, nTotalSec
   LOCAL nYear, nMonth, nDay, nHourIn, nMinIn, nSecIn
   LOCAL a, y, m2, jd, daysSinceEpoch, ts, tsUTC
   LOCAL l, n, i, j

   // Extraer fecha y hora
   cFecha := SUBSTR( cFechaISO, 1, 10 )
   cHora  := SUBSTR( cFechaISO, 12, 8 )

   // Extraer signo y offset
   cSigno   := SUBSTR( cFechaISO, 20, 1 )
   nHoras   := VAL( SUBSTR( cFechaISO, 21, 2 ) )
   nMinutos := VAL( SUBSTR( cFechaISO, 24, 2 ) )
   nOffset  := ( nHoras * 3600 ) + ( nMinutos * 60 )

   IF cSigno == "+"
      nOffset := nOffset
   ELSE
      nOffset := -nOffset
   ENDIF

   // Convertir componentes de entrada a enteros
   nYear := VAL( SUBSTR( cFecha, 1, 4 ) )
   nMonth := VAL( SUBSTR( cFecha, 6, 2 ) )
   nDay := VAL( SUBSTR( cFecha, 9, 2 ) )
   nHourIn := VAL( SUBSTR( cHora, 1, 2 ) )
   nMinIn := VAL( SUBSTR( cHora, 4, 2 ) )
   nSecIn := VAL( SUBSTR( cHora, 7, 2 ) )

   // Calcular días desde epoch (1970-01-01) usando fórmula JD
   a := INT( ( 14 - nMonth ) / 12 )
   y := nYear + 4800 - a
   m2 := nMonth + 12 * a - 3
   jd := nDay + INT( ( 153 * m2 + 2 ) / 5 ) + 365 * y + INT( y / 4 ) - INT( y / 100 ) + INT( y / 400 ) - 32045
   daysSinceEpoch := jd - 2440588

   // Timestamp en segundos (entrada) = days*86400 + h:m:s
   ts := daysSinceEpoch * 86400 + nHourIn * 3600 + nMinIn * 60 + nSecIn

   // Ajustar por offset (el offset del string indica la zona de la fecha de entrada)
   // si el offset es +01:00, debemos restar 3600 para pasar a UTC/local sin offset
   tsUTC := ts - nOffset

   // Convertir tsUTC a fecha y hora (algoritmo inverso de JD)
   daysSinceEpoch := INT( tsUTC / 86400 )
   jd := daysSinceEpoch + 2440588

   l := jd + 68569
   n := INT( ( 4 * l ) / 146097 )
   l := l - INT( ( 146097 * n + 3 ) / 4 )
   i := INT( ( 4000 * ( l + 1 ) ) / 1461001 )
   l := l - INT( ( 1461 * i ) / 4 ) + 31
   j := INT( ( 80 * l ) / 2447 )
   nDay := l - INT( ( 2447 * j ) / 80 )
   l := INT( j / 11 )
   nMonth := j + 2 - 12 * l
   nYear := 100 * ( n - 49 ) + i + l

   // Hora
   nHour := INT( ( tsUTC % 86400 ) / 3600 )
   nMin := INT( ( tsUTC % 3600 ) / 60 )
   nSecOnly := INT( tsUTC % 60 )

   // Formatear fecha ISO YYYY-MM-DDTHH:MM:SS
   cResult := STRZERO( nYear, 4 ) + "-" + STRZERO( nMonth, 2 ) + "-" + STRZERO( nDay, 2 ) + "T" + ;
              STRZERO( nHour, 2 ) + ":" + STRZERO( nMin, 2 ) + ":" + STRZERO( nSecOnly, 2 )

   RETURN cResult

Angel Salom

Visionwin Software - https://www.visionwin.com

fwh 24.07 - harbour 3.2 - bcc 7.7

FiveWiDi
Posts: 1467
Joined: Mon Oct 10, 2005 2:38 pm

Re: Convertir Fecha Uso horario a Fecha-hora

Post by FiveWiDi »

AngelSalom wrote: Wed Nov 12, 2025 11:58 am

Quizás te sirva

Code: Select all | Expand

FUNCTION ISO8601ToLocal( cFechaISO )
   LOCAL cFecha, cHora, cSigno, nHoras, nMinutos, nOffset, dFecha, dLocal, cResult
   LOCAL nHour, nMin, nSecOnly, nFrac, nTotalSec
   LOCAL nYear, nMonth, nDay, nHourIn, nMinIn, nSecIn
   LOCAL a, y, m2, jd, daysSinceEpoch, ts, tsUTC
   LOCAL l, n, i, j

   // Extraer fecha y hora
   cFecha := SUBSTR( cFechaISO, 1, 10 )
   cHora  := SUBSTR( cFechaISO, 12, 8 )

   // Extraer signo y offset
   cSigno   := SUBSTR( cFechaISO, 20, 1 )
   nHoras   := VAL( SUBSTR( cFechaISO, 21, 2 ) )
   nMinutos := VAL( SUBSTR( cFechaISO, 24, 2 ) )
   nOffset  := ( nHoras * 3600 ) + ( nMinutos * 60 )

   IF cSigno == "+"
      nOffset := nOffset
   ELSE
      nOffset := -nOffset
   ENDIF

   // Convertir componentes de entrada a enteros
   nYear := VAL( SUBSTR( cFecha, 1, 4 ) )
   nMonth := VAL( SUBSTR( cFecha, 6, 2 ) )
   nDay := VAL( SUBSTR( cFecha, 9, 2 ) )
   nHourIn := VAL( SUBSTR( cHora, 1, 2 ) )
   nMinIn := VAL( SUBSTR( cHora, 4, 2 ) )
   nSecIn := VAL( SUBSTR( cHora, 7, 2 ) )

   // Calcular días desde epoch (1970-01-01) usando fórmula JD
   a := INT( ( 14 - nMonth ) / 12 )
   y := nYear + 4800 - a
   m2 := nMonth + 12 * a - 3
   jd := nDay + INT( ( 153 * m2 + 2 ) / 5 ) + 365 * y + INT( y / 4 ) - INT( y / 100 ) + INT( y / 400 ) - 32045
   daysSinceEpoch := jd - 2440588

   // Timestamp en segundos (entrada) = days*86400 + h:m:s
   ts := daysSinceEpoch * 86400 + nHourIn * 3600 + nMinIn * 60 + nSecIn

   // Ajustar por offset (el offset del string indica la zona de la fecha de entrada)
   // si el offset es +01:00, debemos restar 3600 para pasar a UTC/local sin offset
   tsUTC := ts - nOffset

   // Convertir tsUTC a fecha y hora (algoritmo inverso de JD)
   daysSinceEpoch := INT( tsUTC / 86400 )
   jd := daysSinceEpoch + 2440588

   l := jd + 68569
   n := INT( ( 4 * l ) / 146097 )
   l := l - INT( ( 146097 * n + 3 ) / 4 )
   i := INT( ( 4000 * ( l + 1 ) ) / 1461001 )
   l := l - INT( ( 1461 * i ) / 4 ) + 31
   j := INT( ( 80 * l ) / 2447 )
   nDay := l - INT( ( 2447 * j ) / 80 )
   l := INT( j / 11 )
   nMonth := j + 2 - 12 * l
   nYear := 100 * ( n - 49 ) + i + l

   // Hora
   nHour := INT( ( tsUTC % 86400 ) / 3600 )
   nMin := INT( ( tsUTC % 3600 ) / 60 )
   nSecOnly := INT( tsUTC % 60 )

   // Formatear fecha ISO YYYY-MM-DDTHH:MM:SS
   cResult := STRZERO( nYear, 4 ) + "-" + STRZERO( nMonth, 2 ) + "-" + STRZERO( nDay, 2 ) + "T" + ;
              STRZERO( nHour, 2 ) + ":" + STRZERO( nMin, 2 ) + ":" + STRZERO( nSecOnly, 2 )

   RETURN cResult

Ángel,

La he probado y me la quedo!!!

Muchísimas gracias,

Un Saludo
Carlos G.

FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Post Reply