C# DateTime은 date, date-time, time data types 을 관리하기 위해 애플리케이션에서 주로 사용되는 struct type 입니다.대부분의 경우 문자열 형식으로 날짜를 가져오며 일반적으로 날짜 차이, 요일, 월 이름, formatting 등과 같은 일부 작업을 수행하기 위해 DateTime 개체로 구문 분석해야 합니다.예를 들어 문자열 값("12/10/2015")이 있고 날짜의 요일(일요일 또는 월요일..)을 찾아야 합니다.
이 시나리오에서는 문자열 값을 DateTime 객체로 변환한 다음 WeekDay 속성(obj.WeekDay)을 사용하여 요일을 찾아야 합니다.Convert.ToDateTime(), DateTime.Parse(),DateTime.ParseExact(), DateTime.TryParse() 및 DateTime.TryParseExact()와 같은 기본 제공 메서드를 사용하여 동일한 작업을 수행할 수 있습니다.
여기서 "en-US"는 미국에 대한 문화 정보입니다. 프랑스어, 독일어 등과 같은 문화에 따라 변경할 수 있습니다.
문자열 값이 null이 아니면 내부적으로 DateTime.Parse() 를 호출하여 결과를 제공합니다. 반면 문자열 값이 null이면 DateTime.MinValue를 "1/1/0001 12:00:00 AM"으로 제공합니다. 이 방법은 항상 문자열 값을 완전히 구문 분석하고 FormatException 문제를 피하기 위해 시도합니다. 다음 예를 살펴보겠습니다.
// Convert.ToDateTime()
string dateString = null;
// null 을 변환합니다.
DateTime dateTime10 = Convert.ToDateTime(dateString); // 1/1/0001 12:00:00 AM
dateString = "not a date";
// Exception: 문자열이 유효한 DateTime으로 인식되지 않았습니다.
// 색인 0에서 시작하는 알 수 없는 단어가 있습니다.
DateTime dateTime11 = Convert.ToDateTime(dateString);
dateString = "Tue Dec 30, 2015";
// Exception: 문자열은 요일이 틀렸기 때문에 유효한 DateTime으로 인식되지 않았습니다.
DateTime dateTime12 = Convert.ToDateTime(dateString);
DateTime.Parse()
지정된 문자열 데이터를 해당 날짜 및 시간으로 변환합니다. 시스템(mscorlib.dll) 네임스페이스에서 사용할 수 있으며 .NET 프레임워크 1.1부터 도입되었습니다. 여기에는 다음 오버로드 메서드가 포함됩니다.
DateTime.Parse(String value)
Value: 날짜와 시간의 문자열 표현입니다. 예를 들어, DateTime.Parse(“01/10/2015”);
Value: 날짜와 시간을 문자열로 표현합니다. Provider:문화 관련 정보를 제공하는 개체입니다. Styles:일부 날짜 및 시간 구문 분석 방법에 대해 문자열 구문 분석을 커스터마이징 하는 formatting 지정 옵션을 정의합니다.,예를 들어 AllowWhiteSpaces는 파싱(parsing) 하는 동안 문자열에 있는 모든 공백을 무시하는 데 도움이 되는 값입니다.
값이 null이면 ArgumentNullException을 반환하고 값에 잘못된 날짜 형식이 포함되어 있으면 FormatException을 반환합니다.
string dateString = null;
// Exception: Argument null exception
DateTime dateTime10 = DateTime.Parse(dateString);
dateString = "not a date";
// Exception: The string was not recognized as a valid DateTime.
// There is an unknown word starting at index 0.
DateTime dateTime11 = DateTime.Parse(dateString);
dateString = "Tue Dec 30, 2015";
// Exception: String was not recognized as a valid DateTime because the day of week was incorrect.
DateTime dateTime12 = DateTime.Parse(dateString);
DateTime.ParseExact()
지정된 문자열을 지정된 형식 및 문화권을 사용하여 동등한 DateTime으로 변환합니다. format의 문자열 값은 datetime의 문자열 값과 일치해야 합니다. 시스템(mscorlib.dll) 네임스페이스에서 사용할 수 있으며 .NET 프레임워크 2.0부터 도입되었습니다. 여기에는 다음 오버로드 메서드가 포함됩니다.
DateTime.ParseExact(string value, string format, IFormatProvider provider)
Value: 날짜와 시간을 문자열로 표현한 것입니다. Format: 변환 후 날짜 모양을 정의하는 형식 지정자입니다. Provider: 문화 정보에 대해 지정하는 객체입니다..
DateTime.ParseExact(string value, string format, IFormatProvider provider, DateTimeStyles style)
Value:날짜와 시간을 문자열로 표현한 것입니다..
Format:변환 후 날짜 모양을 정의하는 형식 지정자입니다.
Provider:문화 정보에 대해 지정하는 객체입니다.
Style: 일부 날짜 및 시간 구문 분석 방법에 대한 문자열 구문 분석을 사용자 정의하는 형식 지정 옵션을 정의합니다..
Value: 날짜와 시간을 문자열로 표현한 것입니다.. Formats: 변환 후 날짜 모양을 정의하는 형식 지정자입니다.형식 목록을 포함하는 문자열 배열이며 DateTime 객체를 변환하려면 하나 이상의 형식이 문자열(값)과 일치해야 합니다. Provider:문화 정보에 대해 지정하는 객체입니다. Style: 일부 날짜 및 시간 구문 분석 방법에 대한 문자열 구문 분석을 사용자 정의하는 형식 지정 옵션을 정의합니다..
값이 null이면 ArgumentNullException을 반환하고 값에 잘못된 날짜 형식이 포함되어 있으면 FormatException을 반환합니다.형식은 문자열 날짜 시간과 일치해야 하며 그렇지 않으면 FormatException이 발생합니다.따라서 이 문제를 극복하기 위해 몇 가지 가능성이 있는 문자열 형식 배열을 사용할 수 있습니다.날짜가 "12/12/2015" 또는 "12-12-2015"와 같은 형식일 수 있다고 가정하고 여기서는 "MM/dd/yyyy" 및 "MM-dd-yyyy"와 같은 형식의 문자열 배열을 전달해야 합니다.
string dateString = null;
CultureInfo provider = CultureInfo.InvariantCulture;
// null 값은 오류를 발생시킵니다.
DateTime dateTime10 = DateTime.ParseExact(dateString, "mm/dd/yyyy", provider);
dateString = "not a date";
// 날짜 형태가 아니므로 오류 발생시킵니다.
// Exception: The string was not recognized as a valid DateTime. There is an unknown word starting at index 0.
DateTime dateTime11 = DateTime.ParseExact(dateString, "mm/dd/yyyy", provider);
dateString = "Tue Dec 30, 2015";
//문자열 날짜 형식이 mm/dd/yyyy 아니므로 오류 발생 시킵니다.
// Exception: String was not recognized as a valid DateTime because the day of week was incorrect.
DateTime dateTime12 = DateTime.ParseExact(dateString, "mm/dd/yyyy", provider);
dateString = "10-22-2015";
// 10/22/2015 12:00:00 AM 형식으로 반환됩니다.
DateTime dateTime13 = DateTime.ParseExact(dateString, "MM-dd-yyyy", provider);
string temp = dateTime13.ToString();
dateString = "10-12-2015";
// dateString 변수의 값인 "10-12-2015"는 "MM.dd.yyyy", "MM-dd-yyyy", "MM/dd/yyyy" 형식 중 하나에 해당하므로 변환이 가능
// 따라서 dateTime16 변수에는 "2015-10-12 00:00:00"과 같은 DateTime 값이 저장됩니다.
DateTime dateTime16 = DateTime.ParseExact(dateString, new string[] { "MM.dd.yyyy", "MM-dd-yyyy", "MM/dd/yyyy" }, provider, DateTimeStyles.None);
DateTime.TryParse()
지정된 문자열 데이터를 동등한 날짜 시간으로 변환하고 구문 분석이 성공했음을 나타내는 구문 분석 후 부울 값을 반환합니다.시스템(mscorlib.dll) 네임스페이스에서 사용할 수 있으며 .NET 프레임워크 2.0부터 도입되었습니다.여기에는 다음 오버로드 메서드가 포함됩니다.
DateTime.TryParse (String value, out DateTime result)
Value:날짜와 시간을 나타내는 문자열입니다.
Result: 구문 분석 후 DateTime 값을 hold 합니다.
DateTime.TryParse(String value, IFormatProvider provider, DateTimeStyles styles, out DateTime result)
Value: 날짜와 시간을 나타내는 문자열입니다.
Provider: 문화별 정보를 제공하는 객체입니다.
Style: 일부 날짜 및 시간 구문 분석 방법에 대한 문자열 구문 분석을 사용자 정의하는 형식 지정 옵션을 정의합니다.예를 들어, AllowWhiteSpaces는 구문 분석하는 동안 문자열에 있는 모든 공백을 무시하는 데 도움이 되는 값입니다.
Result: 구문 분석 후 DateTime 값을 보유합니다.
TryParse()는 항상 문자열 값 datetime을 구문 분석하려고 시도합니다.변환에 성공하면 올바른 DateTime 값을 반환하고 변환에 실패하면 MinValue(1/1/0001 12:00:00 AM)를 반환합니다.문자열 값이 null이거나 비어 있고 DateTime으로 변환하려고 하면 MinValue만 반환됩니다.둘째, 항상 변환 성공 또는 실패를 나타내는 부울 값을 반환합니다.변환에 성공하면 True, 그렇지 않으면 False를 반환합니다.
DateTime.Parse()일 가능성이 높습니다.그러나 유일한 차이점은 변환이 실패할 때 예외를 throw하지 않고 DateTime의 MinValue를 반환한다는 것입니다.
string dateString = null;
// Convert a null string.
DateTime dateTime10;
bool isSuccess = DateTime.TryParse(dateString, out dateTime10); // 1/1/0001 12:00:00 AM
dateString = "not a date";
DateTime dateTime11;
bool isSuccess1 = DateTime.TryParse(dateString, out dateTime11); // 1/1/0001 12:00:00 AM
dateString = "Tue Dec 30, 2015";
DateTime dateTime12;
bool isSuccess2 = DateTime.TryParse(dateString, out dateTime12); // 1/1/0001 12:00:00 AM
DateTime.TryParseExact()
지정된 문자열을 지정된 형식 및 문화권을 사용하여 동등한 DateTime으로 변환합니다. format의 문자열 값은 datetime의 문자열 값과 일치해야 합니다.. 시스템(mscorlib.dll) 네임스페이스에서 사용할 수 있으며 .NET 프레임워크 2.0부터 도입되었습니다. 여기에는 다음 오버로드 메서드가 포함됩니다.
DateTime.ParseExact(string value, string format, IFormatProvider provider, DateTimeStyles style)
Value : 날짜와 시간을 나타내는 문자열입니다.
Format : 변환 후 날짜 모양을 정의하는 형식 지정자입니다.
Provider: 문화 정보에 대해 지정하는 객체입니다.
Style : 일부 날짜 및 시간 구문 분석 방법에 대한 문자열 구문 분석을 사용자 정의하는 형식 지정 옵션을 정의합니다.
Value:날짜 및 시간의 문자열 표현입니다. Formats:변환 후 날짜 모양을 정의하는 형식 지정자입니다.형식 목록을 포함하는 문자열 배열이며 적어도 하나의 형식이 문자열(값)과 일치해야 DateTime 객체를 변환할 수 있습니다. Provider:문화 정보에 대해 지정하는 개체입니다. Style:일부 날짜 및 시간 구문 분석 방법에 대한 문자열 구문 분석을 사용자 정의하는 형식 지정 옵션을 정의합니다.
다음 조건이 충족되면 MinValue( 1/1/0001 12:00:00 AM)를 반환합니다.
문자열 값이 null입니다.
문자열 값이 비어 있습니다.
문자열이 올바른 날짜가 아닙니다.
문자열이 제공된 형식과 일치하지 않습니다.
DateTimeStyle 값이 유효하지 않은 경우에만 예외를 throw하고 그렇지 않으면 MinValue를 반환합니다.
둘째, 변환 성공 여부를 나타내는 부울 값(true 또는 false)을 항상 반환합니다.변환에 성공하면 True를 반환하고 변환에 실패하면 False를 반환합니다.
다음은 더 잘 이해하는 데 도움이 되는 몇 가지 예입니다.
string dateString = null;
CultureInfo provider = CultureInfo.InvariantCulture;
DateTime dateTime10; // 1/1/0001 12:00:00 AM
bool isSuccess1 = DateTime.TryParseExact(dateString, "MM/dd/yyyy", provider, DateTimeStyles.None, out dateTime10);
dateString = "not a date";
// Exception: The string was not recognized as a valid DateTime. There is an unknown word starting at index 0.
DateTime dateTime11; // 1/1/0001 12:00:00 AM
bool isSuccess2 = DateTime.TryParseExact(dateString, "MM/dd/yyyy", provider, DateTimeStyles.None, out dateTime11);
dateString = "Tue Dec 30, 2015";
DateTime dateTime12; //1/1/0001 12:00:00 AM
// Exception: String was not recognized as a valid DateTime because the day of week was incorrect.
bool isSuccess3 = DateTime.TryParseExact(dateString, "MM/dd/yyyy", provider, DateTimeStyles.None, out dateTime12);
dateString = "10-22-2015";
DateTime dateTime13; // 1/1/0001 12:00:00 AM
bool isSuccess4 = DateTime.TryParseExact(dateString, "MM/dd/yyyy", provider, DateTimeStyles.None, out dateTime13);
dateString = "10-22-2015";
DateTime dateTime15; // 10/22/2015 12:00:00 AM
bool isSuccess5 = DateTime.TryParseExact(dateString, "MM-dd-yyyy", provider, DateTimeStyles.None, out dateTime15);
dateString = "10-12-2015";
// Output: 10/22/2015 12:00:00 AM
DateTime dateTime14;
bool isSuccess6 = DateTime.TryParseExact(dateString, new string[]{ "MM/dd/yyyy", "MM-dd-yyyy", "MM.dd.yyyy"}, provider, DateTimeStyles.None, out dateTime14);
DateTime 구조체에는 문자열을 DateTime으로 구문 분석하기 위한 몇 가지 메서드가 있습니다. 우리는 개인차에 대해 논의할 것입니다:
Parse() 와 ConvertToDateTime() 차이점
이 두 가지 방법은 다음과 같은 차이점을 제외하고는 거의 유사합니다.
문자열 값이 null이면 Parse()는 예외를 throw하고, ConvertToDateTime()은 DateTime.MinValue를 반환합니다.
Parse에서는 ConvertToDateTime()을 사용할 수 없는 DataTimeSyles라는 추가 매개변수를 전달할 수 있습니다.
마지막으로 Convert.ToDateTime은 내부적으로 현재 문화권과 함께 DateTime.Parse를 사용합니다.
Parse()와 ParseExact()의 차이점
Parse()와 ParseExact()는 꽤 비슷합니다.그러나 ParseExact()에서는 Parse()에서 사용할 수 없는 추가 매개변수로 형식을 전달할 수 있습니다.형식 매개변수는 날짜가 "11-23-2015"와 같은 다른 형식일 때 문자열 날짜 값을 DateTime 객체로 변환하는 데 도움이 됩니다(형식은 "MM-dd-yyyy"여야 함).
Parse()와 TryParse()의 차이점
DateTime.TryParse(), 이 메서드는 DateTime.Parse(String) 메서드와 유사하지만 DateTime.TryParse() 메서드는 변환이 실패할 경우 예외를 throw하지 않습니다.DateTime.TryParse()는 변환에 실패하면 항상 DateTime.MinValue를 반환하지만 Parse()는 예외를 throw합니다.
DateTime.TryParse() 및 DateTime.TryParseExact()는 형식 매개변수를 제외하고 유사합니다.DateTime.TryParseExact()는 DateTime.TryParse()에서 사용할 수 없는 형식에 대한 추가 매개 변수를 사용합니다.형식 매개변수는 일부 사용자 지정 문자열 형식을 변환하는 데 도움이 됩니다.그러나 DateTime.TryParse()는 사용자 지정 날짜가 제공되면 DateTimenMinValue를 반환합니다.
따라서 구문 분석을 시도하고 (예외를 던지는 대신) 잘못된 데이터를 즉시 처리하려는 경우 TryParse()를 사용하고, 예상하는 형식이 표준 형식이 아니거나 효율성을 위해 특정 표준 형식으로 제한하려는 경우 ParseExact()를 사용하세요.
문자열이 유효한 DateTime이라고 확신하고 형식을 알고 있다면 DateTime.parseExact () 또는 DateTime.tryParseExact () 메소드를 고려할 수도 있습니다.
결론
이 기사에서는 다양한 방식으로 C#에서 DateTime을 구문 분석하는 방법과 그 차이점에 대해 논의했습니다.데이터에 따라 적절한 방법을 선택하십시오.이게 도움이 되길 바란다.