Вход: # секунд с 1-го января, 0001 года
Вывод: # Целых лет в это время период
Я разработал алгоритм, что я не думаю, оптимальное решение. Я думаю, что должно быть решение, которое не включает цикл. См. Блок кода 1 для алгоритма, который A) Определяет количество дней и B) Многократно вычитает 366 или 365 в зависимости от Високосных годов от Дневного Общего количества при постепенном увеличении Общего количества года
Это не столь просто как Делящийся DayCount 365,2425 и усечение, потому что мы поражаем место ошибки в 1 января, 0002 (31 536 000 Секунд / (365.2425 * 24 * 60 * 60)) = 0.99934.
Какая-либо идея о методе нецикличного выполнения для извлечения лет от количества секунд с 1 января, 0001 12:00?
Я должен понять это, потому что мне нужна дата, встроенная в длинное (который хранит секунды) так, чтобы я мог отследить годы к 12 + миллион с 1 второй точностью.
Блок кода 1 - Неэффективный Алгоритм для получения лет с Секунд (Включая Високосные годы)
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
Править: Мое решение состояло в том, чтобы пропустить сбережения памяти встраивания даты в 8 битах и сохранить каждое значение (секунды в течение многих лет) в отдельных целых числах. Это вызывает мгновенные извлечения за счет памяти.
Edit2: Опечатка в первом редактировании (8 битов)
Если вам нужна точность до самого второго , вы, вероятно, желаете коммерческого пакета DateTime; Это просто сложно делать точно простым алгоритмом. Например:
Из-за этих и более осложнений вам лучше не писать код самостоятельно, если только вы не можете расслабиться на ограничение, которое вам нужна точность , в течение всего 12 миллионов лет .
«4 октября, 1582 г. - Сенцереза Авила умирает. Она похоронен на следующий день, 15 октября».
Wikipeda имеет статью в Джальана с алгоритмом, который вы можете адаптироваться к вашим потребностям.
Const TICKS_PER_YEAR As Long = 315360000000000
Function YearsSinceBeginningOfTimeUntil(ByVal d As DateTime) As Integer
Return Math.Floor(d.Ticks / TICKS_PER_YEAR)
End Function
Я думаю, что это будет работать для вас:
function foo(days):
count = days
year = 0
while (count > 0):
if leap_year(year)
count = count - 366
else
count = count - 365
year ++
return year