Convertir una fecha y hora en un número entero largo (y a la inversa)

Fecha y entero

Aquí describo un método sencillo para codificar una fecha y hora en un número entero. He procurado que el número generado sea lo más pequeño posible. Se trata de encadenar una serie de cálculos con el cociente y el resto de la división.
Proporciono el código fuente en Visual Basic.

Características

  • Para que el año ocupe menos espacio sólo utilizo los 2 últimos dígitos;
    es decir, cuento los años transcurridos desde el año 2000.
  • Todos los números deben empezar por cero.
    Por lo tanto le resto uno al mes y le resto uno al día.
  • No tengo en cuenta ni los años bisiestos ni los segundos bisiestos
  • Supongo que todos los meses sin excepción duran 31 días
  • La primera fecha es: 2000-01-01 00:00:00
  • La última fecha es: 16/01/2069 03:14:07 (si es un entero con signo: 231-1)

Tiempo Unix

El algoritmo utilizado recuerda a la forma de calcular el tiempo Unix. Las diferencias son:

  • El tiempo Unix tiene en cuenta los días que dura cada mes (incluyendo años bisiestos)
  • El tiempo Unix empieza a contar a partir del año 1970

Algoritmo

Fórmula para codificar la fecha y hora en un número entero

resultado = segundo + 60 *(minuto + 60 *(hora + 24 *(dia-1 + 30 *(mes-1 + 12 *(RESIDUO(año;100)))))

Para decodificar el número en fecha y hora hay que realizar una serie de divisiones enteras encadenadas:

número 60        
segundo cociente1 60      
  minuto cociente2 24    
    hora cociente3 30  
      día-1 cociente4 12
        mes-1 año-2000

Código Visual Basic

Codifica la fecha y hora en un número entero

Public Function FechaHoraEnEnteroLargo(ByVal fecha As Date) As Long
Dim numero As Long
numero = Year(fecha) Mod 100
numero = numero * 12 + Month(fecha) - 1
numero = numero * 30 + Day(fecha) - 1
numero = numero * 24 + Hour(fecha)
numero = numero * 60 + Minute(fecha)
numero = numero * 60 + Second(fecha)
FechaHoraEnEnteroLargo = numero
End Function

Decodifica el número entero en fecha y hora

Public Function EnteroLargoEnFechaHora(ByVal entero As Long) As Date
Dim seg As Integer: seg = entero Mod 60: entero = entero \ 60
Dim min As Integer: min = entero Mod 60: entero = entero \ 60
Dim hor As Integer: hor = entero Mod 24: entero = entero \ 24
Dim dia As Integer: dia = entero Mod 30 + 1: entero = entero \ 30
Dim mes As Integer: mes = entero Mod 12 + 1: entero = entero \ 12
Dim año As Integer: año = entero + 2000
EnteroLargoEnFechaHora = DateSerial(año, mes, dia) + TimeSerial(hor, min, seg)
End Function

Comprobación del código

Public Sub ComprobarTodo()
ComprobarUno (DateSerial(2000, 1, 1))
ComprobarUno (DateSerial(2012, 12, 5) + TimeSerial(15, 55, 21))
ComprobarUno (Now)
ComprobarUno (EnteroLargoEnFechaHora(2 ^ 31 - 1))
End Sub

Private Sub ComprobarUno(fecha1 As Date)
Dim numero As Long
Dim fecha2 As Date

numero = FechaHoraEnEnteroLargo(fecha1)
fecha2 = EnteroLargoEnFechaHora(numero)

Debug.Print fecha1, numero, fecha2, fecha1 = fecha2
End Sub

Resultado esperado:

01/01/2000 00:00:00               0    01/01/2000 00:00:00   Verdadero
05/12/2012 15:55:21 402.162.921 05/12/2012 15:55:21 Verdadero
05/12/2012 17:31:57 402.168.717 05/12/2012 17:31:57 Verdadero
16/01/2069 03:14:07 2.147.483.647 16/01/2069 03:14:07 Verdadero

Descargas

Icono

Fecha y entero

El icono3d.svg lo he creado con InkScape

Comentarios

Proinf.net, ©2003-2017 ci 3.1.6 (CC) Esta obra está bajo una licencia de Creative Commons Este software está sujeto a la CC-GNU GPL