Skip to content

Instantly share code, notes, and snippets.

@sigmadream
Last active August 20, 2017 17:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sigmadream/b25f0de25d0284d2e40c5b2b8f6a20e6 to your computer and use it in GitHub Desktop.
Save sigmadream/b25f0de25d0284d2e40c5b2b8f6a20e6 to your computer and use it in GitHub Desktop.
Java 날짜관련 몇가지 이상한(?) 점

1582년 10월 4일 => 1582년 10월 15일(달력변경)

public class OldJdkDateTest {

    @Test
    public void shouldGetAfterOneDay() {
        TimeZone utc = TimeZone.getTimeZone("UTC");
        Calendar calendar = Calendar.getInstance(utc);
        calendar.set(1582, Calendar.OCTOBER , 4);
        String pattern = "yyyy.MM.dd";
        String theDay = toString(calendar, pattern, utc);
        assertThat(theDay).isEqualTo("1582.10.04");


        calendar.add(Calendar.DATE, 1);
        String nextDay = toString(calendar, pattern, utc);
        assertThat(nextDay).isEqualTo("1582.10.05");
    }

    private String toString(Calendar calendar, String pattern, TimeZone zone) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        format.setTimeZone(zone);
        return format.format(calendar.getTime());
    }
    
assertThat(nextDay).isEqualTo("1582.10.15");      

1988년 5월 7일 23시, 1시간 후는?(썸머타임)

@Test
public void shouldGetAfterOneHour() {  
    TimeZone seoul = TimeZone.getTimeZone("Asia/Seoul");
    Calendar calendar = Calendar.getInstance(seoul);
    calendar.set(1988, Calendar.MAY , 7, 23, 0);
    String pattern = "yyyy.MM.dd HH:mm";
    String theTime = toString(calendar, pattern, seoul);
    assertThat(theTime).isEqualTo("1988.05.07 23:00");

    calendar.add(Calendar.HOUR_OF_DAY, 1);
    String after1Hour = toString(calendar, pattern, seoul);
    assertThat(after1Hour).isEqualTo("1988.05.08 00:00");
}

assertThat(seoul.inDaylightTime(calendar.getTime())).isTrue();  
assertThat(after1Hours).isEqualTo("1988.05.08 01:00");  

서울 1961년 8월 9일 23시 59분의 1분 후는?(시간대변경)

@Test
public void shouldGetAfterOneMinute() {  
    TimeZone seoul = TimeZone.getTimeZone("Asia/Seoul");
    Calendar calendar = Calendar.getInstance(seoul);
    calendar.set(1961, Calendar.AUGUST, 9, 23, 59);
    String pattern = "yyyy.MM.dd HH:mm";
    String theTime = toString(calendar, pattern, seoul);
    assertThat(theTime).isEqualTo("1961.08.09 23:59");

    calendar.add(Calendar.MINUTE, 1);
    String after1Minute = toString(calendar, pattern, seoul);
    assertThat(after1Minute).isEqualTo("1961.08.10 00:00");
}

assertThat(after1Minute ).isEqualTo("1961.08.10 00:30");  

협정세계시 2012년 6월 30일 23시 59분 59초의 2초 후는?(윤초)

@Test
public void shouldGetAfterTwoSecond() {  
    TimeZone utc = TimeZone.getTimeZone("UTC");
    Calendar calendar = Calendar.getInstance(utc);
    calendar.set(2012, Calendar.JUNE, 30, 23, 59, 59);
    String pattern = "yyyy.MM.dd HH:mm:ss";
    String theTime = toString(calendar, pattern, utc);
    assertThat(theTime).isEqualTo("2012.06.30 23:59:59");

    calendar.add(Calendar.SECOND, 2);
    String afterTwoSeconds = toString(calendar, pattern, utc);
    assertThat(afterTwoSeconds).isEqualTo("2012.07.01 00:00:01");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment