날짜 범위를 지정할 때 흔히 하는 실수
[제목] 날짜 범위를 지정할 때 흔히 하는 실수
날짜를 받아들이는 입력 컨트롤이 문자열을 리턴하는 경우, 혹은 콘솔로부터 날짜를 입력 받는 경우 등 종종 문자열을 날짜로 변경해야 하는 경우가 있다. 그런데 언뜻 보기에는 문제없어 보이는 날짜 범위 지정이 데이타 누락으로 이어지는 경우가 있다.
예를 들어, 다음 예제는 4월 1일부터 4월 30일까지 4월 한달간 데이타를 출력하고자 한다.
논리적으로 큰 문제가 없어 보이는 코드이다. 하지만 실제 출력은 4월1일과 4월15일 데이타만을 출력한다. 즉, 4월30일 데이타는 출력에서 누락된다. 문제는 문자열을 날짜형으로 변환할 때, 문자열(4/30/2013) 이 날짜형(4/30/2013 12:00:00 AM)으로 변경된다는 것이다. 따라서 실제 4/30일에 있는 데이타는 출력에서 누락되는 것이다.
예를 들어, 다음 예제는 4월 1일부터 4월 30일까지 4월 한달간 데이타를 출력하고자 한다.
DateTime[] dataCollection = new DateTime[]{ new DateTime(2013, 4, 1, 5, 10, 0), // 2013.4.1 5:10a new DateTime(2013, 4, 15, 5, 10, 0), // 2013.4.15 5:10a new DateTime(2013, 4, 30, 5, 10, 0), // 2013.4.30 5:10a new DateTime(2013, 5, 1, 5, 10, 0), // 2013.5.1 5:10a }; public void Run_Bad() { PrintMonthData("4/1/2013", "4/30/2013"); } public void PrintMonthData(string strDate1, string strDate2) { DateTime startDate = Convert.ToDateTime(strDate1); DateTime endDate = Convert.ToDateTime(strDate2); foreach (var date in dataCollection) { if (date >= startDate && date <= endDate) Console.WriteLine(date); } }
논리적으로 큰 문제가 없어 보이는 코드이다. 하지만 실제 출력은 4월1일과 4월15일 데이타만을 출력한다. 즉, 4월30일 데이타는 출력에서 누락된다. 문제는 문자열을 날짜형으로 변환할 때, 문자열(4/30/2013) 이 날짜형(4/30/2013 12:00:00 AM)으로 변경된다는 것이다. 따라서 실제 4/30일에 있는 데이타는 출력에서 누락되는 것이다.
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.