Jump to content

Проблема високосного года

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


Категории

[ редактировать ]

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

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

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

from datetime import date
today = date.today()
later = today.replace(year = today.year + 1)

Следующий код Windows C++ является примером ошибки високосного года категории 1. Он будет работать корректно до тех пор, пока текущей датой не станет 29 февраля високосного года. Затем он изменит st для обозначения 29 февраля обычного года, даты, которой на самом деле не существует. Прохождение st к любой функции, которая принимает SYSTEMTIME struct в качестве параметра, скорее всего, потерпит неудачу.

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

SYSTEMTIME st;
FILETIME ft;

GetSystemTime(&st);
st.wYear++;

SystemTimeToFileTime(&st, &ft);

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

DateTime dt = DateTime.Now;
DateTime result = new DateTime(dt.Year + 1, dt.Month, dt.Day);

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

var dt = new Date();
dt.setFullYear(dt.getFullYear() + 1);

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

[ редактировать ]

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

bool isLeapYear = year % 4 == 0;

Правильный алгоритм високосного года описан в разделе «Алгоритм високосного года» .

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

См. также

[ редактировать ]
  1. ^ Джонсон-Пинт, Мэтт. «Каковы примеры ошибок високосного года?» . Переполнение стека . Проверено 5 февраля 2020 г.
  2. ^ Джонсон-Пинт, Мэтт. «Питон — Замена года» . Переполнение стека . Проверено 29 февраля 2020 г.
  3. ^ Джонсон-Пинт, Мэтт. «Манипулирование структурой SystemTIME в Win32/C++» . Переполнение стека . Проверено 5 февраля 2020 г.
  4. ^ Джонсон-Пинт, Мэтт. «.NET/C# — Построение из частей данных» . Переполнение стека . Проверено 5 февраля 2020 г.
  5. ^ Джонсон-Пинт, Мэтт. «JavaScript — Добавление года(ов)» . Переполнение стека . Проверено 5 февраля 2020 г.
  6. ^ Джонсон-Пинт, Мэтт. «Определение того, является ли год високосным» . Переполнение стека . Проверено 5 февраля 2020 г.
  7. ^ Excel ошибочно предполагает, что 1900 год — високосный . Проверено 1 мая 2019 г.
  8. ^ Стандарт ECMA-376/форматы файлов Open Office XML . Проверено 10 сентября 2016 г.
  9. ^ ISO/IEC 29500/Форматы файлов Open Office XML . Проверено 10 сентября 2016 г.
  10. ^ Таулер, Джим (7 января 1997 г.). «Ошибка в программном обеспечении високосного года приводит к «сбою на миллион долларов» » . Дайджест РИСКИ . 18 (74). Комитет ACM по компьютерам и государственной политике . Проверено 5 февраля 2020 г.
  11. ^ «Последний укус жука» . Новости Би-би-си . 5 января 2001 г.
  12. ^ «Системы 7-Eleven столкнулись с проблемой, похожей на 2000 год» . Проверено 10 марта 2023 г.
  13. ^ «Ошибка Y2K поразила норвежскую железную дорогу в конце года» . 1 января 2001 года . Проверено 10 марта 2023 г.
  14. ^ «Главная — Ответы Microsoft» . Форумы.zune.net. Архивировано из оригинала 30 августа 2009 года . Проверено 27 июля 2011 г.
  15. ^ Джон Херрман (31 декабря 2008 г.). «Zunes на 30 ГБ выходит из строя везде и сразу» . Gizmodo.com . Проверено 27 июля 2011 г.
  16. ^ Гир, Дункан (31 декабря 2008 г.). «СРОЧНО: Zunes по всему миру пострадала от загадочной аварии: Tech Digest» . Techdigest.tv . Проверено 27 июля 2011 г.
  17. ^ «Часто задаваемые вопросы по Zune 30» . Майкрософт . 31 декабря 2008. Архивировано из оригинала 2 января 2009 года . Проверено 1 января 2009 г.
  18. ^ Задеган, Брайант (3 января 2009 г.). «Урок бесконечных циклов» . АэроЭкспериенс . Проверено 5 января 2009 г.
  19. ^ «Sony исправляет ошибку високосного года на PS3» . Метро . 2 марта 2010 г. Проверено 10 октября 2019 г.
  20. ^ «Устройства спутниковой навигации TomTom столкнулись с «ошибкой високосного года» GPS » . Новости Би-би-си . 3 апреля 2012 года . Проверено 5 февраля 2020 г.
  21. ^ Джонсон-Пинт, Мэтт (29 февраля 2016 г.). «Список ошибок високосного дня 2016» . Кодекс Мэтта . Проверено 5 февраля 2020 г.
  22. ^ «Из-за сбоя в аэропорту сотни пассажиров остались без штанов» . Местный (де) . Март 2016 года . Проверено 5 февраля 2020 г.
  23. ^ Джонсон-Пинт, Мэтт (29 февраля 2020 г.). «Список ошибок високосного дня 2020 года» . Кодекс Мэтта . Проверено 9 марта 2020 г.
  24. ^ «Список ошибок високосного дня 2024 года» . Кодекс Мэтта . 29 февраля 2024 г. Проверено 29 февраля 2024 г.
  25. ^ «Подача бензина возобновилась после однодневного отключения, причиной которого является сбой в високосный год» . Вестник Новой Зеландии . 01.03.2024 . Проверено 29 февраля 2024 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 701b62a817c13bf24057335a9d8e7b25__1722875100
URL1:https://arc.ask3.ru/arc/aa/70/25/701b62a817c13bf24057335a9d8e7b25.html
Заголовок, (Title) документа по адресу, URL1:
Leap year problem - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)