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