YYYY 대 yyyy - Java Date Formatter가 내 두뇌를 다친 날

3516 단어 isodatesjavajson

소개



프로그래밍의 날짜는 어렵습니다. ISO-8601 Date 표준은 그것들을 더 쉽게 만들었지만 솔직히 말해서 저는 ISO-8601 인증을 받지 않았기 때문에 제 일을 잘하지 못합니다. 내가 아는 것은 날짜 형식을 지정할 때 YYYYyyyy 사이의 매우 중요한 차이점입니다.

Y와 Y의 차이점



DateTimeFormatter Java Docs(ISO-8601 사양 구현)에 따르면
  • y(소문자)는 연도
  • 입니다.
  • Y(대문자)는 '주 기반 연도'입니다.

  • 이 차이로 인해 몇 년이 끝날 때 날짜를 처리하는 경우를 제외하고 코드가 완벽하게 작동합니다.

    다음은 작년에 다루면서 절대적인 즐거움을 느꼈던 예입니다. 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%의 사용 사례에서 다음이 사실입니다.
  • yyyy 좋아
  • YYYY 불량
  • 좋은 웹페이지 즐겨찾기