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,
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
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
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 cResultAngelSalom wrote: Wed Nov 12, 2025 11:58 amQuizá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