Проблема, приводящая к неправильному расчету високосных лет
Проблема високосного года (также известная как ошибка високосного года или ошибка високосного дня ) — это проблема как цифровой (компьютерной), так и нецифровой документации и хранения данных, которая возникает из-за ошибок в расчетах того, какие годы являются високосными , или из-за манипулирования датами без учета разницы между високосными и обычными годами.
Категории
Ошибки високосного года обычно делятся на две категории в зависимости от степени их влияния на реальное использование: [1]
- Те, которые приводят к ошибочным состояниям, таким как исключения, коды возврата ошибок, неинициализированные переменные или бесконечные циклы.
- Те, которые приводят к неверным данным, например, к ошибкам с точностью до единицы в запросах по диапазону или агрегации.
Примеры
Питон
Следующий код Python является примером ошибки категории 1 високосного года. Он будет работать правильно, пока today
не станет 29 февраля. Затем он попытается создать 29 февраля обычного года, которого не существует. date
Конструктор вызовет ValueError
с сообщением «день находится вне диапазона для месяца». [2]
из datetime импорт дата сегодня = дата . сегодня () позже = сегодня . заменить ( год = сегодня . год + 1 )
Windows C++
Следующий код Windows C++ является примером ошибки категории 1 високосного года. Он будет работать правильно, пока текущая дата не станет 29 февраля високосного года. Затем он изменится, st
чтобы представлять 29 февраля обычного года, дату, которая на самом деле не существует. Передача st
в любую функцию, которая принимает SYSTEMTIME
структуру в качестве параметра, скорее всего, не удастся.
Например, SystemTimeToFileTime
вызов, показанный здесь, вернет код ошибки. Поскольку это возвращаемое значение не проверено (что случается крайне часто), это приведет к тому, что ft
оно останется неинициализированным. [3]
SYSTEMTIME st ; FILETIME ft ; GetSystemTime ( & st ) ; st.wYear ++ ;SystemTimeToFileTime ( & st , & ft );
Microsoft C#
Следующий код .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
Следующий код JavaScript является примером ошибки високосного года категории 2. Он будет работать правильно, пока не dt
наступит 29 февраля, например, 2020-02-29. Затем он попытается установить год на 2021. Поскольку 2021-02-29 не существует, объект Date
перейдет к следующей допустимой дате, которая является 2021-03-01. [5]
var dt = new Date ( ) ; dt.setFullYear ( dt.getFullYear ( ) + 1 ) ;
Плохой алгоритм високосного года (многие языки)
Следующий код является примером ошибки високосного года, которая наблюдается во многих языках. Он может вызвать влияние категории 1 или категории 2, в зависимости от того, для чего используется результат. Он неправильно предполагает, что високосный год происходит ровно каждые четыре года. [6]
bool isLeapYear = год % 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 часа, но промежуточным «исправлением» для тех, кто не хотел ждать, было разрядить аккумулятор устройства и затем перезарядить его после полудня UTC 1 января 2009 года. [17] [18]
- PlayStation 3 от Sony неправильно обработала 2010 год как високосный, поэтому несуществующее 29 февраля 2010 года было показано 1 марта 2010 года, что вызвало ошибку программы . [19]
- В 2012 году спутниковые навигационные устройства TomTom вышли из строя из-за ошибки високосного года, которая впервые проявилась 31 марта. [20]
- В 2012 году история чатов Gmail отображала дату 31 декабря 1969 года для всех чатов, сохраненных 29 февраля . [ необходима ссылка ]
- В 2012 году 28 февраля Microsoft Azure был отключен из-за ошибки високосного года. В 17:45 по тихоокеанскому времени команда Windows Azure узнала о проблеме, по-видимому, связанной с неверным расчетом времени для високосного года.
- В 2016 году большое количество ошибок високосного года было каталогизировано в Списке ошибок високосного дня 2016 года на сайте Code of Matter . [21]
- В 2016 году ошибка в системе транспортировки багажа в аэропорту Дюссельдорфа, произошедшая 29 февраля, привела к тому, что более 1200 единиц багажа не были доставлены на рейсы. [22]
- В 2020 году большое количество ошибок високосного года было каталогизировано в Списке ошибок високосного дня 2020 года на сайте Code of Matter . [23]
- В 2024 году большое количество ошибок високосного года было каталогизировано в Списке ошибок високосного дня 2024 года на сайте Code of Matter . [24]
- В 2024 году ошибка в високосном году в работе автоматов по самообслуживанию привела к тому, что заправочные станции с оплатой на АЗС в Новой Зеландии были отключены более чем на 10 часов. [25]
Смотрите также
Ссылки
- ^ Джонсон-Пинт, Мэтт. «Каковы примеры ошибок високосного года?». Stack Overflow . Получено 5 февраля 2020 г.
- ^ Джонсон-Пинт, Мэтт. "Python - Замена года". Stack Overflow . Получено 29 февраля 2020 г. .
- ^ Джонсон-Пинт, Мэтт. "Win32 / C++ SYSTEMTIME struct Manipulation". Stack Overflow . Получено 5 февраля 2020 г. .
- ^ Джонсон-Пинт, Мэтт. ".NET / C# - Строительство из частей даты". Stack Overflow . Получено 5 февраля 2020 г. .
- ^ Джонсон-Пинт, Мэтт. "JavaScript - Добавление года(ов)". Stack Overflow . Получено 5 февраля 2020 г. .
- ^ Джонсон-Пинт, Мэтт. «Определение високосного года». Stack Overflow . Получено 5 февраля 2020 г. .
- ^ Excel ошибочно предполагает, что 1900 год — високосный. Получено 01.05.2019.
- ^ Стандарт ECMA-376 / Форматы файлов Open Office XML. Получено 10 сентября 2016 г.
- ^ Форматы файлов XML ISO/IEC 29500 / Open Office. Получено 10 сентября 2016 г.
- ^ Тоулер, Джим (7 января 1997 г.). «Ошибка в программном обеспечении Leap-Year дает «сбой на миллион долларов»». The RISKS Digest . 18 (74). Комитет ACM по компьютерам и государственной политике . Получено 5 февраля 2020 г.
- ^ "Последний укус жука". BBC News . 5 января 2001 г.
- ^ "7-Eleven Systems Hit by Y2k-like Glitch" . Получено 10 марта 2023 г. .
- ^ "Y2K Bug Hits Norway's Railroad At End Of Year". 1 января 2001 г. Получено 10 марта 2023 г.
- ^ "Главная - Microsoft Answers". Forums.zune.net. Архивировано из оригинала 30 августа 2009 г. Получено 27 июля 2011 г.
- ^ Джон Херрман (2008-12-31). "30-гигабайтные Zune выходят из строя везде и сразу". Gizmodo.com . Получено 2011-07-27 .
- ^ Geere, Duncan (31 декабря 2008 г.). "СРОЧНО: Zunes во всем мире пострадали от загадочного сбоя : Tech Digest". Techdigest.tv . Получено 27 июля 2011 г.
- ^ "Zune 30 FAQ". Microsoft . 31 декабря 2008 г. Архивировано из оригинала 2 января 2009 г. Получено 1 января 2009 г.
- ^ Задеган, Брайант (3 января 2009 г.). "Урок бесконечных циклов". AeroXperience . Получено 5 января 2009 г.
- ^ "Sony исправляет ошибку високосного года на PS3". Metro . 2 марта 2010 г. Получено 10 октября 2019 г.
- ^ "Устройства спутниковой навигации TomTom пострадали от ошибки GPS "високосного года"". BBC News . 3 апреля 2012 г. Получено 5 февраля 2020 г.
- ^ Джонсон-Пинт, Мэтт (29 февраля 2016 г.). «Список ошибок високосного дня 2016 года». Кодекс Мэтта . Получено 5 февраля 2020 г.
- ^ "Сбой в аэропорту оставил сотни пассажиров без штанов". The Local (de) . Март 2016. Получено 5 февраля 2020 .
- ^ Джонсон-Пинт, Мэтт (29 февраля 2020 г.). «Список ошибок високосного дня 2020 года». Кодекс Мэтта . Получено 9 марта 2020 г.
- ^ "Список ошибок високосного дня 2024 года". Кодекс Мэтта . 2024-02-29 . Получено 2024-02-29 .
- ^ "Бензиновые колонки снова заработали после однодневного простоя, вызванного сбоем високосного года". NZ Herald . 2024-03-01 . Получено 2024-02-29 .