본문 바로가기

Programing

1582년 10월 4일의 다음 날은?

간단히 생각해서 10월 5일이라 할 수 있으나 실제로는 1582년 10월 15일이다.


1582년에서 실종된 10일은 그레고리력을 처음 적용하면서 율리우스력에 의해 그동안 누적된 오차를 교정하기 위해서 건너뛴 기간이다. 태양의 황경이 0도가 되는 춘분이 1582년에는 10일 정도 어긋나게 되었다. 교황 그레고리우스 13세는 더 정교한 그레고리력을 1582년 10월 15일에 처음 적용했고, 10월 5 ~ 14일의 날짜는 그 해 달력에서 제외시켰다. 율리우스력은 4년마다 윤년을 두지만, 그레고리력에서는 4년마다 윤년을 두되 매 100번째 해는 윤년이 아니고, 매 400번째 해는 윤년이라는 차이가 있다.


언어에서 테스트를 해보면 어떻게 될까?


[C#]

닷넷에는 System네임스페이스에서 DateTime이라는 클래스가 있는데 AddDays라는 메서드를 제공한다.

 MSDN: DateTime.AddDays Method [링크]

namespace Calendar

{

    [TestFixture]

    public class DateTimeTest

    {

        [Test]

        public void DateTimeAddDaysTest()

        {

            DateTime today = new DateTime(1582, 10, 4, new GregorianCalendar());

            DateTime nextDay = today.AddDays(1);

            DateTime expectDay = new DateTime(1582, 10, 15);


            Assert.AreEqual(expectDay, nextDay);

        }

    }

}


NUnit으로 테스트를 돌려보면 실패한다.


1582년 10월 15일이 아닌 1582년 10월 5일이 반환되었음을 알 수 있다.


[Java]

package github.namhokim.drive.service;


import static org.junit.Assert.*;

import static org.hamcrest.Matchers.*;

import static org.hamcrest.MatcherAssert.assertThat;


import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.TimeZone;


import org.junit.Test;


public class CalendarTest {


@Test

public final void testCalender() {

TimeZone utc = TimeZone.getTimeZone("UTC");

        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));

        calendar.set(1582, Calendar.OCTOBER , 4);

        String pattern = "yyyy.MM.dd";

        String theDay = toString(calendar, pattern, utc);

        assertThat(theDay, is(equalTo("1582.10.04")));



        calendar.add(Calendar.DATE, 1);

        String nextDay = toString(calendar, pattern, utc);

        assertThat(nextDay, is(equalTo("1582.10.15")));

}

private String toString(Calendar calendar, String pattern, TimeZone zone) {

        SimpleDateFormat format = new SimpleDateFormat(pattern);

        format.setTimeZone(zone);

        return format.format(calendar.getTime());

    }


}


JUnit으로 돌려보면 녹색막대가 뜬다.





'Programing' 카테고리의 다른 글

프로그래머의 장점/단점은...  (0) 2017.05.21
음성 알고리즘을 이용한 키워드 정정 방법들  (0) 2016.07.19
[문서] 요구사항 명세  (0) 2015.03.10
엘리베이터 피치  (0) 2015.03.10
소프트웨어 품질의 특성  (0) 2015.03.10