FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Convertir Fecha Uso horario a Fecha-hora
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Convertir Fecha Uso horario a Fecha-hora
Posted: Tue Nov 11, 2025 09:59 PM

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

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Convertir Fecha Uso horario a Fecha-hora
Posted: Wed Nov 12, 2025 12:18 AM
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Convertir Fecha Uso horario a Fecha-hora
Posted: Wed Nov 12, 2025 08:31 AM
Antonio Linares wrote:

Estimado Carlos,

https://deepwiki.com/search/existe-alguna-funcin-que-convi_36154061-a500-47ad-8865-9c603af025ff?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

Posts: 728
Joined: Fri Oct 07, 2005 07:38 AM
Re: Convertir Fecha Uso horario a Fecha-hora
Posted: Wed Nov 12, 2025 11:58 AM

Quiz谩s te sirva

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 19.05 - harbour 3.2 - bcc 7.4
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Convertir Fecha Uso horario a Fecha-hora
Posted: Wed Nov 12, 2025 02:53 PM
AngelSalom wrote:

Quiz谩s te sirva

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

Continue the discussion