본문 바로가기

Programming Language/Java & Scala

DateTimeFormatter에서 년도표시에 yyyy대신 uuuu를 사용해야하는 이유?

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 

태그