Нужна формула: Извлечение лет с Секунд с 1 января, 0001 12:00

Вход: # секунд с 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 битов)

8
задан Brian Webster 29 January 2010 в 08:51
поделиться

4 ответа

Если вам нужна точность до самого второго , вы, вероятно, желаете коммерческого пакета DateTime; Это просто сложно делать точно простым алгоритмом. Например:

Из-за этих и более осложнений вам лучше не писать код самостоятельно, если только вы не можете расслабиться на ограничение, которое вам нужна точность , в течение всего 12 миллионов лет .

«4 октября, 1582 г. - Сенцереза ​​Авила умирает. Она похоронен на следующий день, 15 октября».

22
ответ дан 5 December 2019 в 05:56
поделиться

Wikipeda имеет статью в Джальана с алгоритмом, который вы можете адаптироваться к вашим потребностям.

5
ответ дан 5 December 2019 в 05:56
поделиться
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
1
ответ дан 5 December 2019 в 05:56
поделиться

Я думаю, что это будет работать для вас:

function foo(days):
  count = days
  year = 0
  while (count > 0):
    if leap_year(year)
      count = count - 366
    else
      count = count - 365
    year ++
  return year
-1
ответ дан 5 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: