YYYY 대 yyyy - Java Date Formatter가 내 두뇌를 다친 날
소개
프로그래밍의 날짜는 어렵습니다. ISO-8601 Date 표준은 그것들을 더 쉽게 만들었지만 솔직히 말해서 저는 ISO-8601 인증을 받지 않았기 때문에 제 일을 잘하지 못합니다. 내가 아는 것은 날짜 형식을 지정할 때 YYYY
와 yyyy
사이의 매우 중요한 차이점입니다.
Y와 Y의 차이점
DateTimeFormatter Java Docs(ISO-8601 사양 구현)에 따르면
DateTimeFormatter Java Docs(ISO-8601 사양 구현)에 따르면
이 차이로 인해 몇 년이 끝날 때 날짜를 처리하는 경우를 제외하고 코드가 완벽하게 작동합니다.
다음은 작년에 다루면서 절대적인 즐거움을 느꼈던 예입니다. 2019년 12월 31일(2019년 12월 31일) 날짜의 경우
yyyy
는 2019년을 출력하지만 YYYY
는 2020년을 출력합니다. 그 이유는 기술적으로 12월 31일이 속하는 주가 2020년의 첫 번째 주이기 때문입니다. 이 문제는 알아차리고 디버그하기 어려울 수 있습니다.제 경우에는 2019년 12월 31일이 프론트엔드에서 전송되어 DB에 올바르게 저장되었지만 반환될 때 2020년 12월 31일로 바뀌었고 아무도 이유를 몰랐습니다. 우리의 기본 JSON 날짜 포맷터는
YYYY
를 사용해야 하는 곳에서 yyyy
를 사용하는 범인이었습니다.예시
포맷터 선언
// y (Lowercase)
DateTimeFormatter formatteryyyy = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// Y (Uppercase)
DateTimeFormatter formatterYYYY = DateTimeFormatter.ofPattern("YYYY-MM-dd");
날짜에서 문자열로 변환할 때
// Contains value from Database (December 31st 2019)
LocalDateTime dateTime;
// String value will be 2019-12-31
String yyyy = dateTime.format(formatteryyyy);
// String value will be 2020-12-31
String YYYY = dateTime.format(formatterYYYY);
문자열에서 날짜로 변환할 때
// Actual date value will be 2020-12-31
LocalDateTime parsedDateyyyy = LocalDateTime.parse("2020-12-31", formatteryyyy);
// Actual date value will be 2019-12-31
LocalDateTime parsedDateYYYY= LocalDateTime.parse("2020-12-31", formatterYYYY);
결론
99%의 사용 사례에서 다음이 사실입니다.
// y (Lowercase)
DateTimeFormatter formatteryyyy = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// Y (Uppercase)
DateTimeFormatter formatterYYYY = DateTimeFormatter.ofPattern("YYYY-MM-dd");
// Contains value from Database (December 31st 2019)
LocalDateTime dateTime;
// String value will be 2019-12-31
String yyyy = dateTime.format(formatteryyyy);
// String value will be 2020-12-31
String YYYY = dateTime.format(formatterYYYY);
// Actual date value will be 2020-12-31
LocalDateTime parsedDateyyyy = LocalDateTime.parse("2020-12-31", formatteryyyy);
// Actual date value will be 2019-12-31
LocalDateTime parsedDateYYYY= LocalDateTime.parse("2020-12-31", formatterYYYY);
99%의 사용 사례에서 다음이 사실입니다.
Reference
이 문제에 관하여(YYYY 대 yyyy - Java Date Formatter가 내 두뇌를 다친 날), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/shane/yyyy-vs-yyyy-the-day-the-java-date-formatter-hurt-my-brain-4527텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)