de entrada: Número de segundos desde el 1 de enero del año 0001fórmula: Años extraer de segundos desde el 1 de enero de 0001 12:00a.m.
de salida: Número de años completos durante este período de tiempo
Desarrollé un algoritmo que no creo que sea la solución óptima. Creo que debería haber una solución que no implique un ciclo. Ver Código Bloque 1 para el algoritmo que A) Determina la cantidad de días y B) Resta iterativamente 366 o 365 según los Años Leap del Total diario al incrementar el Total del año
No es tan simple como Dividir DayCount por 365.2425 y truncando, porque llegamos a un punto de falla el 1 de enero de 0002 (31536000 Seconds/(365.2425 * 24 * 60 * 60)) = 0.99934.
¿Alguna idea sobre un método sin bucle para extraer años de una cantidad de segundos desde el 1 de enero de 0001 12:00 AM?
Necesito resolver esto porque necesito una fecha incrustada en un largo (que almacena segundos) para que pueda rastrear años a más de 12 millones con una precisión de 1 segundo.
bloque de código 1 - ineficiente Algoritmo para obtener Años de segundos (incluyendo los años bisiestos)
Dim Days, Years As Integer
'get Days
Days = Ticks * (1/24) * (1/60) * (1/60) 'Ticks = Seconds from Year 1, January 1
'get years by counting up from the beginning
Years = 0
While True
'if leap year
If (Year Mod 4 = 0) AndAlso (Year Mod 100 <> 0) OrElse (Year Mod 400 = 0) Then
If Days >= 366 Then 'if we have enough days left to increment the year
Years += 1
Days -= 366
Else
Exit While
End If
'if not leap year
Else
If Days >= 365 Then 'if we have enough days left to increment the year
Years += 1
Days -= 365
Else
Exit While
End If
End If
End While
Return Years
Editar: Mi solución fue saltarse el ahorro de memoria de incrustar una fecha dentro de 8 bits y almacenar cada valor (segundos a años) en enteros separados. Esto causa recuperaciones instantáneas a expensas de la memoria.
Edit2: error tipográfico en la primera edición (8 bits)
¿Está al tanto de las reformas del calendario que resultaron en unos pocos días que se saltaron? – Thilo
¡No te olvides de los segundos interminables! : D – Miles
Estoy confundido, ¿por qué no estás usando la época? – JSchlather