Section 19.11: DateTime.TryParseExact(String, String, IFormatProvider, DateTimeStyles, DateTime) 메소드

날짜 및 시간을 나타내는 문자열을 특정 서식 및 문화권 설정 서식 정보와 스타일 값을 사용하여 DateTime 에 해당하는 객체로 변환시킨다. 파라미터로 사용될 서식 정보는 문자열에 나타난 서식 정보와 정확하게 일치하여야 한다. 메소드의 반환값은 변환이 성공적으로 이루어졌는지를 나타낸다.

예제:

CultureInfo enUS = new CultureInfo("en-US"); string dateString; System.DateTime dateValue;

스타일 설정 없이 날짜를 파싱하기.

dateString = " 5/01/2009 8:30 AM"; if (DateTime.TryParseExact(dateString, "g", enUS, DateTimeStyles.None, out dateValue)) { Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, dateValue.Kind); } else { Console.WriteLine("'{0}' is not in an acceptable format.", dateString); } // 날짜 문자열 앞의 공백 문자를 허용한다. if (DateTime.TryParseExact(dateString, "g", enUS, DateTimeStyles.AllowLeadingWhite, out dateValue)) { Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, dateValue.Kind); } else { Console.WriteLine("'{0}' is not in an acceptable format.", dateString); }

사용자 서식 MMM 사용하기.

dateString = "5/01/2009 09:00"; if (DateTime.TryParseExact(dateString, "M/dd/yyyy hh:mm", enUS, DateTimeStyles.None, out dateValue)) { Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, dateValue.Kind); } else { Console.WriteLine("'{0}' is not in an acceptable format.", dateString); } // MM 형식으로 동일한 문자열 파싱을 시도한다. if (DateTime.TryParseExact(dateString, "MM/dd/yyyy hh:mm", enUS, DateTimeStyles.None, out dateValue)) { Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, dateValue.Kind); } else { Console.WriteLine("'{0}' is not in an acceptable format.", dateString); }

시간대 정보를 포함하는 문자열 파싱하기.

dateString = "05/01/2009 01:30:42 PM -05:00"; if (DateTime.TryParseExact(dateString, "MM/dd/yyyy hh:mm:ss tt zzz", enUS, DateTimeStyles.None, out dateValue)) { Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, dateValue.Kind); } else { Console.WriteLine("'{0}' is not in an acceptable format.", dateString); } // UTC (협정 세계시) 결과를 반환한다. if (DateTime.TryParseExact(dateString, "MM/dd/yyyy hh:mm:ss tt zzz", enUS, DateTimeStyles.AdjustToUniversal, out dateValue)) { Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, dateValue.Kind); } else { Console.WriteLine("'{0}' is not in an acceptable format.", dateString); }

UTC 형식의 문자열 파싱하기.

dateString = "2008-06-11T16:11:20.0904778Z"; if (DateTime.TryParseExact(dateString, "o", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateValue)) { Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, dateValue.Kind); } else { Console.WriteLine("'{0}' is not in an acceptable format.", dateString); } if (DateTime.TryParseExact(dateString, "o", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateValue)) { Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, dateValue.Kind); } else { Console.WriteLine("'{0}' is not in an acceptable format.", dateString); }

출력 결과

' 5/01/2009 8:30 AM' is not in an acceptable format. Converted ' 5/01/2009 8:30 AM' to 5/1/2009 8:30:00 AM (Unspecified). Converted '5/01/2009 09:00' to 5/1/2009 9:00:00 AM (Unspecified). '5/01/2009 09:00' is not in an acceptable format. Converted '05/01/2009 01:30:42 PM -05:00' to 5/1/2009 6:30:42 PM (Local). Converted '05/01/2009 01:30:42 PM -05:00' to 5/1/2009 6:30:42 PM (Utc). Converted '2008-06-11T16:11:20.0904778Z' to 6/11/2008 4:11:20 PM (Local). Converted '2008-06-11T16:11:20.0904778Z' to 6/11/2008 4:11:20 PM (Utc).
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 19.10: DateTime 사용 시의 순수 함수 관련 유의 사항

Wikipedia 에서는 순수 함수 (pure function) 를 아래와 같이 정의하고 있다:

  1. 동일한 파라미터가 주어졌을 때 항상 동일한 결과값을 반환하는 함수. 함수의 결과값은 어떠한 숨겨진 정보나, 프로그램의 각기 다른 실행 순서로 인해 변경될 수 있는 상태 (state) 정보, 혹은 입출력 기기를 통한 외부 입력 값 등에 의존적이어서는 안된다.
  2. 함수의 실행은 변경 가능한 (mutable) 객체에 변형을 가한다거나 입출력 장치에 출력을 수행하는 등 의미론적으로 관찰 가능한 (semantically observable) 부수 효과 (side effect) 를 초래하지 않아야 한다.

개발자로써 순수 함수에 대해서 정확히 이해하는 것은 매우 중요하며 이와 관련된 내용은 여러 분야에 걸쳐 자주 맞닥뜨리게 될 것이다. 많은 초급 개발자들을 이로 인한 혼란에 빠트리게 하는 경우 중 하나가 바로 DateTime 클래스의 메소드를 사용하는 경우이다. 이 클래스의 메소드중 상당수가 순수 함수로써, 이러한 사실을 모르고 있었다면 실제 사용시에 의외로 느낄 수 있을 것이다. 다음 예제를 확인해 본다:

DateTime sample = new DateTime(2016, 12, 25); sample.AddDays(1); Console.WriteLine(sample.ToShortDateString());

위 예제를 보았을 때, 콘솔에 찍히게 될 결과가 '26/12/2016' 일 것이라고 생각할 수 있겠지만, 실제 결과는 초기 설정 값과 동일한 값이 출력될 것이다. 이는 AddDays 가 순수 함수이기 때문으로, 객체가 가지고 있는 원래의 날짜는 영향을 받지 않게 된다. 위에서 예상한 대로의 결과를 얻고자 한다면, AddDays 함수의 사용 방법을 아래와 같이 변경하여야 할 것이다:

sample = sample.AddDays(1);
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 19.9: DateTime.AddYears(Int32) 메소드

DateTime 객체에 일정 크기의 년 (year) 정보를 더한다:

DateTime baseDate = new DateTime(2000, 2, 29); Console.WriteLine("Base Date: {0:d}\n", baseDate); // 이전 15 년동안의 날짜를 출력한다. for (int ctr = -1; ctr >= -15; ctr--) Console.WriteLine("{0,2} year(s) ago:{1:d}", Math.Abs(ctr), baseDate.AddYears(ctr)); Console.WriteLine(); // // 이후 15 년동안의 날짜를 출력한다. for (int ctr = 1; ctr <= 15; ctr++) Console.WriteLine("{0,2} year(s) from now: {1:d}", ctr, baseDate.AddYears(ctr));

출력 결과:

Base Date: 2/29/2000  1 year(s) ago:2/28/1999  2 year(s) ago:2/28/1998  3 year(s) ago:2/28/1997  4 year(s) ago:2/29/1996  5 year(s) ago:2/28/1995  6 year(s) ago:2/28/1994  7 year(s) ago:2/28/1993  8 year(s) ago:2/29/1992  9 year(s) ago:2/28/1991 10 year(s) ago:2/28/1990 11 year(s) ago:2/28/1989 12 year(s) ago:2/29/1988 13 year(s) ago:2/28/1987 14 year(s) ago:2/28/1986 15 year(s) ago:2/28/1985  1 year(s) from now: 2/28/2001  2 year(s) from now: 2/28/2002  3 year(s) from now: 2/28/2003  4 year(s) from now: 2/29/2004  5 year(s) from now: 2/28/2005  6 year(s) from now: 2/28/2006  7 year(s) from now: 2/28/2007  8 year(s) from now: 2/29/2008  9 year(s) from now: 2/28/2009 10 year(s) from now: 2/28/2010 11 year(s) from now: 2/28/2011 12 year(s) from now: 2/29/2012 13 year(s) from now: 2/28/2013 14 year(s) from now: 2/28/2014 15 year(s) from now: 2/28/2015
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 19.8: DateTime.DaysInMonth(Int32, Int32) 메소드

const int July = 7; const int Feb = 2; int daysInJuly = System.DateTime.DaysInMonth(2001, July); Console.WriteLine(daysInJuly); // 1998 년도는 윤년이 아니었기 때문에 daysInFeb 의 값은 28 이 될 것이다. int daysInFeb = System.DateTime.DaysInMonth(1998, Feb); Console.WriteLine(daysInFeb); // 1996 년도는 윤년이었기 때문에 daysInFebLeap 의 값은 29 가 될 것이다. int daysInFebLeap = System.DateTime.DaysInMonth(1996, Feb); Console.WriteLine(daysInFebLeap);

출력 결과:

31 28 29
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 19.7: DateTime.Compare(DateTime t1, DateTime t2) 메소드

DateTime date1 = new DateTime(2009, 8, 1, 0, 0, 0); DateTime date2 = new DateTime(2009, 8, 1, 12, 0, 0); int result = DateTime.Compare(date1, date2); string relationship; if (result < 0) relationship = "is earlier than"; else if (result == 0) relationship = "is the same time as"; else relationship = "is later than"; Console.WriteLine("{0} {1} {2}", date1, relationship, date2);

출력 결과:

8/1/2009 12:00:00 AM is earlier than 8/1/2009 12:00:00 PM
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 19.6: DateTime.AddMilliseconds(Double) 메소드

string dateFormat = "MM/dd/yyyy hh:mm:ss.fffffff"; DateTime date1 = new DateTime(2010, 9, 8, 16, 0, 0); Console.WriteLine("Original date: {0} ({1:N0} ticks)\n", date1.ToString(dateFormat), date1.Ticks); DateTime date2 = date1.AddMilliseconds(1); Console.WriteLine("Second date: {0} ({1:N0} ticks)", date2.ToString(dateFormat), date2.Ticks); Console.WriteLine("Difference between dates: {0} ({1:N0} ticks)\n", date2 - date1, date2.Ticks - date1.Ticks); DateTime date3 = date1.AddMilliseconds(1.5); Console.WriteLine("Third date: {0} ({1:N0} ticks)", date3.ToString(dateFormat), date3.Ticks); Console.WriteLine("Difference between dates: {0} ({1:N0} ticks)", date3 - date1, date3.Ticks - date1.Ticks);

출력 결과:

Original date: 09/08/2010 04:00:00.0000000 (634,195,584,000,000,000 ticks) Second date: 09/08/2010 04:00:00.0010000 (634,195,584,000,010,000 ticks) Difference between dates: 00:00:00.0010000 (10,000 ticks) Third date: 09/08/2010 04:00:00.0020000 (634,195,584,000,020,000 ticks) Difference between dates: 00:00:00.0020000 (20,000 ticks)
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 19.5: DateTime.TryParse(String, DateTime) 메소드

// 날짜 및 시간을 나타내는 문자열을 DateTime 에 해당하는 객체로 변환시키고 변환이 성공했는지 여부를 나타내는 값을 반환한다. string[] dateTimeStrings = new [] { "14:23 22 Jul 2016", "99:23 2x Jul 2016", "22/7/2016 14:23:00" }; foreach(var dateTimeString in dateTimeStrings) { DateTime dateTime; bool wasParsed = DateTime.TryParse(dateTimeString, out dateTime); string result = dateTimeString + (wasParsed ? $" was parsed to {dateTime}" : " can't be parsed to DateTime"); Console.WriteLine(result); }

출력 결과:

14:23 22 Jul 2016 was parsed to 7/22/2016 2:23:00 PM 99:23 2x Jul 2016 can't be parsed to DateTime 22/7/2016 14:23:00 can't be parsed to DateTime
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 19.4: DateTime.Parse(String) 메소드

// 날짜 및 시간을 나타내는 문자열을 DateTime 에 해당하는 객체로 변환시킨다 var dateTime = DateTime.Parse("14:23 22 Jul 2016"); Console.WriteLine(dateTime.ToString());
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts