Найти в Дзене
Golang-news

Как определить, является ли год високосным с помощью языка GO

Оглавление

Не все годы имеют одинаковую длину — некоторые короче или длиннее других — поэтому, если вы пишете код, который имеет дело с датами и продолжительностью, это может быть важно учитывать.

Что такое високосный год?

В григорианском календаре в високосном году 366 дней, тогда как в других годах всего 365.

Дополнительный день известен как високосный день . (Технический термин — день вставки , но его труднее запомнить!)

Каждый год, не являющийся високосным, называется обычным годом . Они называются так просто потому, что случаются чаще, чем високосные годы.

В високосный год в феврале месяце 29 дней, тогда как месяц обычно состоит только из 28 дней.

Один год из каждых четырех является високосным.

Зачем нам нужны високосные годы?

Год определяется как время, за которое планета обращается вокруг своей звезды.

Поскольку разные планеты в нашей Солнечной системе вращаются вокруг Солнца с разной скоростью и по разным траекториям, год на одной планете может быть длиннее или короче, чем на другой.

Например, на планете Венера в году около 225 земных дней. На Марсе в году 687 земных суток.

Однако даже здесь, на Земле, в году не бывает целого числа дней.

Это связано с тем, что Земля обращается вокруг Солнца в среднем за 365,2422 дня.

Наши годы могут содержать только 365 или 366 дней, так как мы не привыкли работать с дробными числами, но это означает, что наш календарь может рассинхронизироваться с вращением Земли, на котором он в конечном счете основан.

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

Вот почему у нас есть високосные годы через равные промежутки времени.

Что такое григорианский календарь?

Григорианский календарь — это система, которая сейчас используется в большинстве стран мира для датировки событий.

Он получил свое название потому, что впервые был представлен в Европе папой Григорием XIII в 1582 году.

До этого с 45 г. до н.э. использовался юлианский календарь (названный в честь Юлия Цезаря, древнеримского полководца, предложившего ввести его на территориях, управляемых Римом).

Григорианский календарь более точен, чем юлианский, из-за того, как он обрабатывает високосные годы, как мы увидим, когда посмотрим на какой-нибудь код Go.

Попытка определить, является ли год високосным в Go

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

Другими словами, если мы работаем с 2000 годом, можем ли мы разделить 4 на 2000 без остатка?

Давайте напишем код Go, чтобы выяснить это:

Выше видно, что 2000 делится на 4, а это значит, что год, когда мы вступили во второе тысячелетие, был, по сути, високосным.

Мы также распечатали результаты за несколько других лет, так что мы можем протестировать нашу небольшую полезную функцию.

Однако вы также должны видеть из имени, которое я дал функции — назвав ее «наивной попыткой», — что я не думаю, что это идеальное решение.

Не знаю, заметили вы или нет, но один из распечатанных выше результатов неверен, и в следующем разделе мы собираемся улучшить нашу функцию, чтобы решить эту проблему.

Завершение нашего алгоритма

Почти верно , что каждый четвертый год високосный, но это не совсем так.

Есть еще одно правило, которое мы должны учитывать, если хотим, чтобы наша функция давала точные результаты.

Если год делится на 100 и не делится на 400, то он никогда не может быть високосным.

(На самом деле, это правило было введено при переходе от юлианского к григорианскому календарю, упомянутому выше, и именно поэтому последняя система является более точной, поскольку в ней чуть меньше високосных лет на больших промежутках времени.)

Итак, давайте добавим несколько дополнительных условий в нашу функцию, чтобы использовать это новое знание:

-2

Вы можете видеть, что результат для 1800 года сейчас false — тогда как, когда мы использовали предыдущую версию нашей функции, мы получили неверный ответ true.

Функция isLeapYear теперь точна и может использоваться в реальных приложениях.

Сжатие логики функции в одну строку

Также можно написать однострочный код, выполняющий ту же работу, как показано ниже:

-3

Использование пакета My Go

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

Вы можете просмотреть его репозиторий GitHub в Интернете, где есть предоставленная документация.

Ниже приведен последний пример, который использует мой пакет для заполнения списка всех лет между 1900 и 1999 годами включительно, которые были високосными годами:

-4

Мы инициализировали leapYearsBetweenStartAndEndYears срез емкостью 100(которая является результатом вычисления ).(endYear-startYear)+1

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

Выполнение кода должно привести к следующему результату:

There were 24 years between 1900 and 1999 that were leap years.They are listed below:

1904
1908
1912
1916
1920
1920
1924
1928
1932
1936
1940
1944
1948
1952
1956
1960
1964
1968
1972
1976
1980
1984
1988
1992
1996

Мы видим, что ни один из перечисленных выше високосных годов не делится на 100, так как 1900 год исключается по правилу, о котором мы говорили выше, но все годы делятся на 4, так как это относится ко всем високосным годам.