Проблема високосного года - Leap year problem

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

Категории

Ошибки високосного года обычно делятся на две категории воздействия:[1]

  1. Те, которые приводят к ошибочным состояниям, например исключения, коды возврата ошибок, неинициализированные переменные или бесконечные циклы
  2. Те, которые приводят к некорректным данным, например, отдельные проблемы в запросах диапазона или агрегации.

Примеры

Python

Следующий код Python является примером ошибки високосного года Категории 1. Он будет работать нормально, пока сегодня становится 29 февраля. Затем он попытается создать 29 февраля обычного года, которого не существует. В Дата конструктор поднимет ValueError с сообщением «день выходит за рамки месяца».[2]

из дата и время импорт Датасегодня = Дата.сегодня()потом = сегодня.заменять(год = сегодня.год + 1)

Windows C ++

Следующий код Windows C ++ является примером ошибки високосного года Категории 1. Он будет работать нормально, пока ул становится 29 февраля. Затем он попытается создать 29 февраля обычного года, которого не существует. Передавая это любой функции, которая принимает СИСТЕМНОЕ ВРЕМЯ struct, скорее всего, не удастся.

Например, SystemTimeToFileTime Показанный здесь вызов вернет код ошибки. Поскольку это возвращаемое значение не отмечено (что очень часто), это приведет к футов остаются неинициализированными.[3]

СИСТЕМНОЕ ВРЕМЯ ул;FILETIME футов;GetSystemTime(&ул);ул.год++;SystemTimeToFileTime(&ул, &футов);

C #

Следующий код .NET C # является примером ошибки високосного года Категории 1. Он будет работать нормально, пока dt становится 29 февраля. Затем он попытается создать 29 февраля обычного года, которого не существует. В DateTime конструктор бросит ArgumentOutOfRangeException.[4]

DateTime dt = DateTime.Сейчас же;DateTime результат = новый DateTime(dt.Год + 1, dt.Месяц, dt.День);

JavaScript

Следующий код JavaScript является примером ошибки високосного года Категории 2. Он будет работать нормально, пока dt становится 29 февраля, например, 29 февраля 2020 г. Затем он попытается установить 2021 год. Поскольку 2021-02-29 не существует, Дата объект будет перенесен на следующую действительную дату, то есть 2021-03-01.[5]

вар dt = новый Дата();dt.setFullYear(dt.getFullYear() + 1);

Алгоритм плохого високосного года (много языков)

Следующий код является примером ошибки високосного года, которая встречается на многих языках. Это может вызвать воздействие Категории 1 или 2, в зависимости от того, для чего используется результат. Он неверно предполагает, что високосный год происходит ровно каждые четыре года.[6]

bool isLeapYear = год % 4 == 0;

Правильный алгоритм високосного года объясняется на Алгоритм високосного года.

Вхождения

Было много случаев ошибок високосного года:

  • В 2020 году большое количество ошибок високосного года было каталогизировано в Список ошибок високосного дня 2020 г. на сайте Кодекс Мэтта.[7]
  • В 2016 г. произошла ошибка високосного года в системе конвейеров для багажа в г. Дюссельдорф аэропорт 29 февраля вылетело более 1200 единиц багажа.[8]
  • В 2016 году большое количество ошибок високосного года было каталогизировано в Список ошибок високосного дня 2016 года на сайте Кодекс Мэтта.[9]
  • В 2012, Microsoft Azure была отключена из-за ошибки високосного года 28 февраля. В 17:45 по тихоокеанскому стандартному времени группа разработчиков Windows Azure узнала о проблеме, по-видимому, из-за неправильного расчета времени для високосного года.
  • В 2012, Gmail в истории чата была указана дата 31 декабря 1969 г. для всех чатов, сохраненных на 29 февраля.[нужна цитата ]
  • В 2012, TomTom Устройства спутниковой навигации вышли из строя из-за ошибки високосного года, которая впервые появилась 31 марта.[10]
  • Sony PlayStation 3 неправильно рассматривал 2010 год как високосный, поэтому несуществующий 29 февраля 2010 года был показан 1 марта 2010 года и вызвал ошибка программы.[11]
  • В полночь 31 декабря 2008 г. многие[12] первое поколение Zune 30 модели замерли.[13][14] Microsoft заявила, что проблема была вызвана внутренними часами Водитель написано Freescale и то, как устройство обрабатывает високосный год. Он автоматически исправился через 24 часа, но промежуточным «исправлением» для тех, кто не хотел ждать, был разряд батареи устройства, а затем подзарядка после полудня. универсальное глобальное время 1 января 2009 г.[15][16]
  • В 1996 г. два алюминиевых завода по Tiwai Point, Новая Зеландия и Белл Бэй 31 декабря в Тасмании, Австралия, произошла ошибка високосного года, когда каждый из 660 компьютеров, управляющих плавильными линиями, отключился ровно в полночь одновременно и без предупреждения. Компьютеры не были запрограммированы на работу в 366-й день в году. Стоимость ремонта оценивается более чем в 1 миллион новозеландских долларов.[17]
  • Майкрософт Эксель с самых ранних версий ошибочно считал 1900 год високосным, поэтому 29 февраля приходится на период с 28 февраля по 1 марта того же года. Ошибка возникла из Лотос 1-2-3, и был намеренно реализовано в Excel с целью Обратная совместимость. Microsoft написала статью об этой ошибке, в которой объясняет, почему 1900 год считается високосным.[18] Эта ошибка стала требованием в спецификации Ecma Office Open XML (OOXML).[19][20]

Смотрите также

Рекомендации

  1. ^ Джонсон-Пинт, Мэтт. "Какие примеры ошибок високосного года?". Переполнение стека. Получено 5 февраля 2020.
  2. ^ Джонсон-Пинт, Мэтт. «Питон - Замена года». Переполнение стека. Получено 29 февраля 2020.
  3. ^ Джонсон-Пинт, Мэтт. "Win32 / C ++ Управление структурой SYSTEMTIME". Переполнение стека. Получено 5 февраля 2020.
  4. ^ Джонсон-Пинт, Мэтт. ".NET / C # - Построение из частей даты". Переполнение стека. Получено 5 февраля 2020.
  5. ^ Джонсон-Пинт, Мэтт. «JavaScript - добавление года (лет)». Переполнение стека. Получено 5 февраля 2020.
  6. ^ Джонсон-Пинт, Мэтт. «Определение того, является ли год високосным». Переполнение стека. Получено 5 февраля 2020.
  7. ^ Джонсон-Пинт, Мэтт. «Список ошибок високосного дня 2020 года». Кодекс Мэтта. Получено 9 марта 2020.
  8. ^ «Из-за сбоя в аэропорту сотни пассажиров остались без одежды». Местный (де). Получено 5 февраля 2020.
  9. ^ Джонсон-Пинт, Мэтт. «Список ошибок високосного дня 2016 года». Кодекс Мэтта. Получено 5 февраля 2020.
  10. ^ "В навигаторах TomTom обнаружена ошибка високосного года GPS'". Новости BBC. Получено 5 февраля 2020.
  11. ^ «Sony исправляет ошибку високосного года для PS3». метро. 2 марта 2010 г.. Получено 10 октября 2019.
  12. ^ «Главная - Ответы Microsoft». Forums.zune.net. Архивировано из оригинал 30 августа 2009 г.. Получено 2011-07-27.
  13. ^ Джон Херрман (31 декабря 2008 г.). «30 ГБ Zunes выходят из строя везде и сразу». Gizmodo.com. Получено 2011-07-27.
  14. ^ Гир, Дункан. "РАЗРЫВ: Zunes по всему миру обрушился на тайный сбой: Tech Digest". Techdigest.tv. Получено 2011-07-27.
  15. ^ "Zune 30 FAQ". Microsoft. 31 декабря 2008 г.. Получено 1 января, 2009.
  16. ^ Задеган, Брайант (3 января 2009 г.). «Урок бесконечных циклов». AeroXperience. Получено 5 января, 2009.
  17. ^ Таулер, Джим. «Ошибка в високосном программном обеспечении дает» сбой на миллион долларов"". Дайджест РИСКОВ. Комитет ACM по компьютерам и государственной политике. Получено 5 февраля 2020.
  18. ^ Excel ошибочно предполагает, что 1900 год високосный. Проверено 1 мая 2019.
  19. ^ Стандартные форматы файлов ECMA-376 / Open Office XML. Проверено 10 сентября 2016.
  20. ^ Форматы файлов ISO / IEC 29500 / Open Office XML. Проверено 10 сентября 2016.