윤년문제

Leap year problem

윤년 문제(윤년 버그 또는 윤일 버그라고도 함)는 디지털(컴퓨터 관련)과 비디지털 문서화 및 데이터 저장 상황 모두에 대한 문제로서, 어느 연도가 윤년인지 또는 윤년과 공통 y의 차이와 무관하게 날짜를 조작하여 발생한다.

분류

윤년 버그는 실제 사용 시 발생할 수 있는 영향의 양에 따라 일반적으로 두 가지 범주로 분류된다.[1]

  1. 예외, 오류 반환 코드, 초기화되지 않은 변수 또는 끝없는 루프와 같은 오류 조건을 초래하는 경우
  2. 범위 쿼리 또는 집계에서 오프바이원 문제처럼 잘못된 데이터로 이어지는 데이터

파이톤

다음의 Python 코드는 카테고리 1 윤년 버그의 예다. 될 때까지 제대로 될 것이다. today 2월 29일이 된다. 그런 다음 존재하지 않는 2월 29일을 공통의 해로 만들려고 할 것이다.date 건설업자가 a를 조달할 것이다. ValueError "하루가 월 범위를 벗어남"이라는 메시지와 함께.[2]

로부터 datetime 수입하다 날짜를 잡다 금일 = 날짜를 잡다.금일() 나중의 = 금일.대체하다(연도 = 금일.연도 + 1) 

윈도 C++

다음의 윈도 C++ 코드는 카테고리 1 윤년 버그의 예다. 현재 날짜가 윤년의 2월 29일이 될 때까지 제대로 작동할 것이다. 그리고 나서, 그것은 수정될 것이다. st 실제로 존재하지 않는 날짜인, 보통 해의 2월 29일을 나타낸다. 패스 st 을 받아들이는 어떤 기능에도 SYSTEMTIME 매개 변수로서 구조는 실패할 가능성이 높다.

예를 들어, SystemTimeToFileTime 여기에 표시된 호출은 오류 코드를 반환한다. 이 반환 값은 선택되지 않았으므로(매우 일반적임), 결과적으로 ft 초기화되지 않은 채로 방치되는 [3]

시스템타임 세인트; 파일타임 ft;  GetSystemTime(&세인트); 세인트.w년++;  SystemTimeToFileTime(&세인트, &ft); 

마이크로소프트 C#

다음과 같다.NET C# 코드는 범주 1 윤년 버그의 예다. 될 때까지 제대로 될 것이다. dt 2월 29일이 된다. 그런 다음 존재하지 않는 2월 29일을 공통의 해로 만들려고 할 것이다.DateTime 건설업자가 투척할 것이다. ArgumentOutOfRangeException.[4]

날짜 시간 dt = 날짜 시간.지금; 날짜 시간 결과 = 새로운 날짜 시간(dt.연도 + 1, dt., dt.); 

자바스크립트

다음의 자바스크립트 코드는 카테고리 2 윤년 버그의 예다. 될 때까지 제대로 될 것이다. dt 2020-02-29와 같은 2월 29일이 된다. 그리고 그 해를 2021년으로 설정하려고 시도할 것이다. 2021-02-29는 존재하지 않기 때문에, 이 회사는 Date 개체는 다음 유효 날짜인 2021-03-01로 롤포워드 된다.[5]

시합을 하다 dt = 새로운 날짜(); dt.setFull Year(dt.getFullYear() + 1); 

불량 윤년 알고리즘(다양한 언어)

다음 코드는 여러 언어로 볼 수 있는 윤년 버그의 예다. 어떤 용도로 사용되는지에 따라 범주 1 또는 범주 2에 영향을 미칠 수 있다. 그것은 윤년이 정확히 4년마다 일어난다고 잘못 가정한다.[6]

바가지 긁다 isLeap Year = 연도 % 4 == 0; 

올바른 윤년 알고리즘은 윤년 알고리즘에서 설명된다.

발생 횟수

윤년 벌레가 많이 발생했다.

  • 마이크로소프트 엑셀은 초기 버전부터 1900년을 윤년으로 잘못 간주해 2월 29일이 그해 2월 28일에서 3월 1일 사이에 온다고 한다. 이 버그는 Lotus 1-2-3에서 유래했으며, 역호환성을 목적으로 엑셀에서 의도적으로 구현되었다. 마이크로소프트는 1900년을 윤년으로 취급하는 이유를 설명하면서 이 벌레에 대한 기사를 썼다.[7] 이 버그는 Ecma Office Open XML(OOXML) 규격의 요구 사항으로 승격되었다.[8][9]
  • 1996년 뉴질랜드 티와이포인트와 호주 태즈메이니아 벨베이의 알루미늄 제련소 2곳은 12월 31일 윤년 버그를 경험했는데, 이때 제련용 화분선을 제어하는 컴퓨터 660대가 각각 자정 무렵에 예고 없이 동시에 가동이 중단됐다. 그 컴퓨터들은 366일을 다루도록 프로그램되지 않았다. 수리 비용은 100만 달러 이상으로 추산되었다.[10]
  • 2008년 12월 31일 자정, 많은 1세대[11] Zune 30 모델이 얼었다.[12][13] 마이크로소프트는 이 문제가 프리스케일이 작성한 내부 시계 드라이버와 장치가 윤년을 처리하는 방식에 의해 발생했다고 밝혔다. 24시간 후 자동으로 스스로 고쳤으나 기다리지 않으려는 사람들을 위한 중간 '고정'은 2009년 1월 1일 정오 UTC 이후 기기 배터리를 방전시킨 후 재충전하는 것이었다.[14][15]
  • 소니의 플레이스테이션 3는 2010년을 윤년으로 잘못 취급하여 2010년 2월 29일에 존재하지 않는 것을 2010년 3월 1일에 보여주었고, 프로그램 오류를 일으켰다.[16]
  • 2012년 톰톰 위성항법장치는 3월 31일 처음 등장한 윤년 버그로 오작동했다.[17]
  • 2012년 Gmail의 채팅 기록은 2월 29일 저장된 모든 채팅에 대해 1969년 12월 31일을 보여주었다.[citation needed]
  • 2012년에 마이크로소프트 아즈레는 2월 28일 윤년 버그에 의해 오프라인으로 전환되었다. PST 오후 5시 45분에 윈도우 아즈레 팀은 윤년에 맞지 않는 시간 계산 때문에 문제를 인식하게 되었다.
  • 2016년에는 웹사이트 코드 오브 매트(Code of Matt)의 2016 윤일 버그 목록에 윤년 버그가 대량으로 분류되었다.[18]
  • 2016년 2월 29일 뒤셀도르프 공항의 수하물 컨베이어 시스템에 윤년 버그가 발생해 1,200여 개의 수하물이 항공편을 놓쳤다.[19]
  • 2020년에는 많은 의 윤년 버그가 웹사이트인 Code of Matt의 2020 윤일 버그 목록에 분류되었다.[20]

참고 항목

참조

  1. ^ Johnson-Pint, Matt. "What are some examples of leap year bugs?". Stack Overflow. Retrieved 5 February 2020.
  2. ^ Johnson-Pint, Matt. "Python - Replacing the year". Stack Overflow. Retrieved 29 February 2020.
  3. ^ Johnson-Pint, Matt. "Win32 / C++ SYSTEMTIME struct manipulation". Stack Overflow. Retrieved 5 February 2020.
  4. ^ Johnson-Pint, Matt. ".NET / C# - Construction from date parts". Stack Overflow. Retrieved 5 February 2020.
  5. ^ Johnson-Pint, Matt. "JavaScript - Adding Year(s)". Stack Overflow. Retrieved 5 February 2020.
  6. ^ Johnson-Pint, Matt. "Determining if a Year is a Leap Year". Stack Overflow. Retrieved 5 February 2020.
  7. ^ 엑셀은 1900년을 윤년이라고 잘못 가정했다. 검색된 2019-05-01
  8. ^ 표준 ECMA-376 / Open Office XML 파일 형식. 2016-09-10년 검색됨
  9. ^ ISO/IEC 29500 / 개방형 오피스 XML 파일 형식. 2016-09-10년 검색됨
  10. ^ Towler, Jim (7 January 1997). "Leap-Year software bug gives "Million-dollar glitch"". The RISKS Digest. ACM Committee on Computers and Public Policy. 18 (74). Retrieved 5 February 2020.
  11. ^ "Home - Microsoft Answers". Forums.zune.net. Archived from the original on August 30, 2009. Retrieved 2011-07-27.
  12. ^ John Herrman (2008-12-31). "30GB Zunes Failing Everywhere, All At Once". Gizmodo.com. Retrieved 2011-07-27.
  13. ^ Geere, Duncan (31 December 2008). "BREAKING: Zunes worldwide hit by mystery crash : Tech Digest". Techdigest.tv. Retrieved 2011-07-27.
  14. ^ "Zune 30 FAQ". Microsoft. December 31, 2008. Retrieved January 1, 2009.
  15. ^ Zadegan, Bryant (January 3, 2009). "A lesson on infinite loops". AeroXperience. Retrieved January 5, 2009.
  16. ^ "Sony fixes PS3 leap year bug". Metro. 2 March 2010. Retrieved 10 October 2019.
  17. ^ "TomTom sat-nav devices hit by GPS 'leap year bug'". BBC News. 3 April 2012. Retrieved 5 February 2020.
  18. ^ Johnson-Pint, Matt (29 February 2016). "List of 2016 Leap Day Bugs". Code of Matt. Retrieved 5 February 2020.
  19. ^ "Airport hiccup leaves 100s of passengers pantless". The Local (de). March 2016. Retrieved 5 February 2020.
  20. ^ Johnson-Pint, Matt (29 February 2020). "List of 2020 Leap Day Bugs". Code of Matt. Retrieved 9 March 2020.