Java는 0 년이 윤년이지만 0 년은 존재하지 않았다고 말합니다.
내가 업데이트하고있는 몇 가지 편리한 메소드에 대한 테스트 케이스를 작성 중이고 0 년에 LocalDate
의 isLeapYear()
메소드를 사용하면 어떤 일이 발생하는지보기로 결정했습니다. 내가 이해했듯이 0 년은 실제로 존재하지 않았습니다. AD 1 년 전은 1 년이었습니다. 기원전. (이것은 내가 오래 전에 읽은 기사를 기반으로합니다. 그 출처는 제가 오랫동안 잊고있었습니다.) 놀랍게도 제 테스트에 따르면 0 년이 윤년임을 알 수있었습니다!
나는 것을 깨닫게 java.time.LocalDate
클래스가 구현하는 ISO-8601하지만은 ISO-8601 정말 년 0의 존재를 나타냅니다합니까? 나는 테스트를 한 사람들 LocalDate
이 이것을 테스트 케이스로 놓쳤을 것이라고 믿기를 주저하지만 ISO-8601과 같은 국제 표준이 그러한 명백한 실수를 범할 것이라고 믿기를 주저합니다.
다른 가능성은 내가 읽은 기사가 완전히 잘못되었다는 것입니다. (또는 당시에는 맞았지만 나중에 다시 생각했습니다.)
이것은 그다지 중요하지 않지만 ISO-8601, Java의 LocalDate
클래스 또는 시간 계산 방법에 대한 나의 이해와 같은 실수가 어디에 있는지 알고 싶습니다.
TL; DR : LocalDate
국제 표준 (ISO 8601)에 따라 문서화 된 작업을 수행합니다. 이것이 "올바른지"여부는 완전히 다른 질문입니다.
LocalDate
자바 독 자체는이 경고를 포함한다 :
윤년에 대한 오늘날의 규칙이 항상 적용되는 proleptic Gregorian 달력 시스템과 동일합니다. 오늘날 작성된 대부분의 애플리케이션의 경우 ISO-8601 규칙이 전적으로 적합합니다. 그러나 과거 날짜를 사용하고 정확한 날짜를 요구하는 모든 애플리케이션은 ISO-8601 접근 방식이 적합하지 않다는 것을 알게됩니다.
Wikipedia에는 proleptic Gregorian 달력 에 대한 자세한 정보가 있습니다 . 무엇보다도 다음과 같이 말합니다.
수학적으로는 음 (BC) 연도와 양 (AD) 연도 사이의 연도 계산을 용이하게하기 위해 0 년을 포함하고 이전 연도를 음수로 나타내는 것이 더 편리합니다. 이것은 천문 연도 번호 지정 및 국제 표준 날짜 시스템 인 ISO 8601에서 사용되는 규칙입니다. 이러한 시스템에서 0 년은 윤년입니다.
이 모든 것에 대한 역사적 맥락으로 들어가는 동안 잠시 용서해주십시오.
서양 달력의 연도는 표면 상 예수 그리스도의 탄생으로부터 계산되지만, 그렇게하는 아이디어는 6 세기에 시작되었으며 현재 달력은 16 세기에 이루어진 계산을 기반으로합니다. 로마 숫자는 0도 음수도 나타내지 않았기 때문에 연도는 "예수 후"(AD, anno domini ) 또는 "예수 전"(BC, "그리스도 전")으로 계산되었습니다. 따라서 전통적으로 기원전 1 년 뒤에는 AD 1 년이오고 그 사이에 0 년이 없습니다.
그러나 1 세기에는 아무도 그렇게 세지 않았습니다. 비교를 위해 누가 복음은 예수님 께서 사역을 시작하신 해를 다음과 같이 묘사합니다.
티 베리우스 카이사르 통치 15 년에 본 디오 빌라도는 유대의 총독, 헤롯은 갈릴리의 총독, 그의 형제 빌립은 이투 라에 아와 트라 코니 티스 지역의 4 대교, 리사 니아는 아 빌렌의 4 대교,
누가는 예수가 당시 "약 30 세"라고 묘사했기 때문에 표면적으로 이것은 AD 30 년이었을 것입니다. 그러나 현대 역사가들은 일반적으로 AD 525 년에 anno domini 시스템 을 제안한 Dionysius Exiguus 가 틀 렸기 때문에 연도가 적어도 1 ~ 2 년 차이가났다는 데 동의합니다 . (정확한 날짜는 여전히 다소 논란의 여지가 있습니다. 자세한 내용은 Wikipedia를 참조하십시오 .)
그러나 지금 고치기에는 너무 늦었습니다. 율리우스 력에서 그레고리력으로의 전환조차도 2 주도 안되는 불일치 였지만 전환이 수세기에 걸쳐 유럽 전역에서 발생하면서 광범위한 정치적 저항에 직면했습니다. 연도 번호 변경이 얼마나 파괴적인지 상상할 수 있습니다. 지금이 될 것입니다!
그렇다면이 역사는 오늘날 소프트웨어와 어떤 관련이 있습니까? 불행히도 날짜를 계산하고 기록하는 무수한 방법으로 인해 시간을 앞뒤로 이동하면서 일관된 방식으로 작동하는 달력을 포기하거나 계산 된 날짜를 포기해야합니다. 당시 실제 사람들이 사용했을 날짜와 일치하는 내용이 있습니다. 이 차이는 생각보다 더 빠르게 발생합니다. 많은 유럽 국가에서 100 년이 채되지 않은 지금도 여전히 율리우스 력을 사용하고 있었으며 유럽의 다른 모든 국가와 거의 2 주 차이가있었습니다!
당연히, LocalDate
이 엉망진창의 손을 씻고 오늘날 우리가 사용하는 방식으로 만 달력을 구현합니다. Javadoc은 "오늘 작성된 대부분의 애플리케이션에 대해 ISO-8601 규칙이 전적으로 적합합니다. 그러나 과거 날짜를 사용하고 정확한 날짜를 요구하는 애플리케이션은 ISO-8601 접근 방식이 적합하지 않다는 것을 알게 될 것입니다."라고 말합니다.
에서 위키 백과 :
... 천문 연도 번호 (기원전 1 년 율리우스와 일치) 및 ISO 8601 : 2004 (기원전 1 년 그레고리력과 일치)에는 0 년이 있습니다.
'developer tip' 카테고리의 다른 글
string :: c_str ()은 C ++ 11에서 더 이상 null로 끝나지 않습니까? (0) | 2020.10.27 |
---|---|
Mac에서 bashrc 파일은 어디에서 찾을 수 있습니까? (0) | 2020.10.27 |
HTML에서 IMG의 높이 및 너비 속성을 지정해야합니까? (0) | 2020.10.27 |
dict를 올바르게 하위 클래스로 만들고 __getitem__ 및 __setitem__을 재정의하는 방법 (0) | 2020.10.27 |
확장 가능한 목록보기에서 모든 하위 항목 확장 (0) | 2020.10.27 |