Java 8 이상부터는 데이터 포맷 형식에서 연도를 표기하는 yyyy외에도 uuuu가 추가되어있다.

 

먼저 예시 코드와 출력물은 아래와 같다.

 

    private void checkYear(){
		LocalDateTime localDateTime = LocalDateTime.of(0, 12, 30, 0, 0);
		System.out.println("기원전에서 서기 날짜 출력");
		for ( int i = 0 ; i < 5 ; i++ ){
			String yyResult = localDateTime.format(DateTimeFormatter.ofPattern("G yyyy-MM-dd"));
			String uuResult = localDateTime.format(DateTimeFormatter.ofPattern("G uuuu-MM-dd"));
			System.out.println(yyResult + "\t" + uuResult);
			localDateTime = localDateTime.plusDays(1);
		}
		System.out.println("\n기원전, 서기 각각 100년에 대한 포맷 출력");
		LocalDateTime localDateTime2 = LocalDateTime.of(-100, 12, 30, 0, 0);
		LocalDateTime localDateTime3 = LocalDateTime.of(100, 12, 30, 0, 0);
		String yyResult2 = localDateTime2.format(DateTimeFormatter.ofPattern("G yyyy-MM-dd"));
		String uuResult2 = localDateTime2.format(DateTimeFormatter.ofPattern("G uuuu-MM-dd"));
		System.out.println(yyResult2 + "\t" + uuResult2);
		
		String yyResult3 = localDateTime3.format(DateTimeFormatter.ofPattern("G yyyy-MM-dd"));
		String uuResult3 = localDateTime3.format(DateTimeFormatter.ofPattern("G uuuu-MM-dd"));
		System.out.println(yyResult3 + "\t" + uuResult3);
	}
//	기원전에서 서기 날짜 출력
//	기원전 0001-12-30	기원전 0000-12-30
//	기원전 0001-12-31	기원전 0000-12-31
//	서기 0001-01-01	서기 0001-01-01
//	서기 0001-01-02	서기 0001-01-02
//	서기 0001-01-03	서기 0001-01-03
//
//	기원전, 서기 각각 100년에 대한 포맷 출력
//	기원전 0101-12-30	기원전 -0100-12-30
//	서기 0100-12-30	서기 0100-12-30

 

첫 번째 출력 결과로 확인할 수 있는 내용으로는 yyyy의 표기인 경우, 서기 1년 1월 1일 전일 은 기원전 0년 12월 31일이 아니라, 기원전 1년 12월 31일이 된다.

 

두 번째 출력 결과로 확인할 수 있는 내용으로는 기원전 100년을 표기하고 싶었지만, yyyy에서는 음수 처리와 함께 101년으로 변경되었다.

 

실제로 연도를 가지고 계산을 하거나 표기를 할 때는 uuuu 패턴을 사용하는 것이 안전할 수 있다고 볼 수 있다.