DateTimeFormatter는 Java에서 datetime을 표시할때 가장 많이 사용하는 코드중 하나입니다. 보통 아래와 같은 코드로 표기하여 사용하는데요.
LocalDate m = LocalDate.of(2018,12,31);
String str = m.format(DateTimeFormatter.ofPattern("yyyy-MM"); //2018-12
선언한 pattern에 따라 LocalDate가 변경되어 String으로 반환되는 모습을 볼 수 있습니다.
위 pattern은 아래와 같은 특징을 가지는데요.
위 특징에 따라 보통 년도를 표시할때 yyyy를 사용하곤 합니다.
그런데 stackoverflow의 이 질문(링크)에서는 yyyy대신 uuuu를 사용하라고 합니다.
왜일까요? 서기, 기원전 표시 때문인데요. yyyy는 signed로 표시되기 때문에 기원전의 경우 양수로 표시된다고 합니다.
실제년도 |yyyy
2019 |2019
2018 |2018
2017 |2017
...
10 |10
9 |9
...
2 |2
1 |1
0 |1
-1 |2
-2 |3
그렇기 때문에 만약 yyyy패턴으로 출력후 3이 나온다면 이게 기원전 2년도인지 기원후 3년도인지 구별이 불가능하기 때문이라고 합니다.
이 때문에 실제로 Oracle Java8의 문서에도 uuuu로 사용할 것을 예시로 들고 있습니다.
그러므로 년도를 표기하고 싶다면 uuuu를 사용하는 편이 좋을것으로 보입니다.
yyyy를 표기하고 서기/기원후를 표기하고 싶다면 아래와 같은 방식으로 사용하는 것을 권장한다고 합니다.
LocalDate m = LocalDate.of(2018,12,31);
String str = m.format(DateTimeFormatter.ofPattern("yyyy GG-MM"); //2018 서기-12
LocalDate m = LocalDate.of(-1,12,31);
String str = m.format(DateTimeFormatter.ofPattern("yyyy GG-MM"); //2018 기원전-12
반응형