날짜가 yyyy-dd-MM 형식 인 DateTime.TryParse 문제


82

다음 날짜는 문자열 형식 "2011-29-01 12:00 am"입니다. 이제 다음 코드를 사용하여이를 datetime 형식으로 변환하려고합니다.

DateTime.TryParse(dateTime, out dt); 

하지만 나는 항상 dt를 {1/1/0001 12:00:00 AM}으로 받고 있습니다. 이유를 말씀해 주시겠습니까? 그 문자열을 날짜로 어떻게 변환 할 수 있습니까?

편집 : 나는 모두가 형식 인수를 사용하도록 언급하는 것을 보았습니다. 사용자가 원하는 사용자 지정 날짜 형식을 선택하는 일부 설정이 있고 해당 사용자를 기반으로 jQuery datepicker를 통해 해당 형식의 텍스트 상자에서 날짜를 자동으로 가져올 수 있으므로 format 매개 변수를 사용할 수 없다는 점을 지금 언급하겠습니다.


4
그런데의 반환 값을 확인하여 변환이 실패했는지 확인할 수 있습니다 TryParse. 그것은입니다 bool success = DateTime.TryParse(...);.
— Jim Mischel 2011 년

답변:


184

이것은 "2011-29-01 12:00 am"예제를 기반으로 작동합니다.

DateTime dt;
DateTime.TryParseExact(dateTime, 
                       "yyyy-dd-MM hh:mm tt", 
                       CultureInfo.InvariantCulture, 
                       DateTimeStyles.None, 
                       out dt);

8
나를 이길. 입력 문자열의 형식을 알고 있다면 거의 항상 TryParseExact / ParseExact 메서드를 사용해야합니다.
— Euro Micelli 2011 년

좋아, 그래서 내 날짜 형식은 예제의 것과 비슷하지만 일 또는 월 값이 한 자리이면 DateTime 파서가 오류를 반환합니다. 왜냐하면 하나만있을 때 두 자리를 찾았 기 때문입니다. 이 시나리오에서 무엇을 제안 하시겠습니까?
— Ciaran Gallagher

11
내 질문에 답하기 위해이 경우 형식에 단일 문자를 사용하면 단일 문자와 이중 문자 날짜 모두에 대해 작동합니다. 예 : d / m / yyyy는 2012
— Ciaran Gallagher

이 @BrokenGlass이 함께 도움을 나를 기쁘게 할 수 나를 위해 작동하지 않습니다
— 미나

2
@CiaranGallagher 그냥 작은 말, 당신의 의견에 날짜가 큰 M (D / M / 년)를 사용한다
— Yusril Maulidan 라지

14

ParseExact방법 을 사용해야합니다 . 이것은 datetime의 형식을 지정하는 두 번째 인수로 문자열을 취합니다. 예를 들면 다음과 같습니다.

// Parse date and time with custom specifier.
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
try
{
   result = DateTime.ParseExact(dateString, format, provider);
   Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
}

사용자가 UI에서 형식을 지정할 수있는 경우이 형식을이 메서드에 전달할 수있는 문자열로 변환해야합니다. 사용자가 형식 문자열을 직접 입력하도록 허용하면 됩니다. 이는 유효하지 않은 형식 문자열을 입력하기 때문에 변환이 실패 할 가능성이 더 높다는 것을 의미 하거나 가능한 선택 사항을 제공하는 콤보 상자를 사용하여 이러한 선택에 대한 형식 문자열을 설정합니다.

입력이 올바르지 않을 가능성이있는 경우 (예 : 사용자 입력) TryParseExact오류 사례를 처리하기 위해 예외를 사용 하는 것보다 사용 하는 것이 좋습니다.

// Parse date and time with custom specifier.
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
DateTime result;
if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out result))
{
   Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
else
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
}

더 나은 대안은 사용자에게 날짜 형식을 선택 하지 않고 형식 배열을 사용하는 오버로드를 사용하는 것입니다 .

// A list of possible American date formats - swap M and d for European formats
string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                   "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                   "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                   "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                   "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm",
                   "MM/d/yyyy HH:mm:ss.ffffff" };
string dateString; // The string the date gets read into

try
{
    dateValue = DateTime.ParseExact(dateString, formats, 
                                    new CultureInfo("en-US"), 
                                    DateTimeStyles.None);
    Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
}
catch (FormatException)
{
    Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
}                                               

구성 파일이나 데이터베이스에서 가능한 형식을 읽으면 사람들이 날짜를 입력하려는 모든 다른 방법을 만나면서 여기에 추가 할 수 있습니다.


5

안전한 TryParseExact 메서드를 사용해보십시오.

DateTime temp;
string   date = "2011-29-01 12:00 am";

DateTime.TryParseExact(date, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out temp);

4

에서 날짜 시간 MSDN의 :

형식 : System.DateTime %이 메서드가 반환 될 때 s에 포함 된 날짜 및 시간 (변환에 성공한 경우) 또는 MinValue (변환에 실패한 경우)에 해당하는 DateTime 값을 포함합니다 . s 매개 변수가 null이거나 빈 문자열 ( "")이거나 날짜 및 시간의 유효한 문자열 표현이 포함되지 않은 경우 변환이 실패합니다. 이 매개 변수는 초기화되지 않은 상태로 전달됩니다.

"yyyy-dd-MM hh:mm tt"대신 형식 문자열과 함께 parseexact를 사용하십시오 .


3

작동합니다.

DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);

1
DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);

0

사용자에게 날짜 / 시간 형식을 변경할 수있는 기회를 제공하는 경우 구문 분석에 사용할 해당 형식 문자열을 만들어야합니다. 가능한 날짜 형식을 알고 있다면 (즉, 사용자가 목록에서 선택해야 함) 컴파일 타임에 이러한 형식 문자열을 만들 수 있기 때문에 훨씬 쉽습니다.

사용자가 날짜 / 시간 형식의 자유 형식 디자인을 수행하도록 허용하는 경우 DateTime런타임에 해당 형식 문자열 을 만들어야합니다 .


맞습니다 짐 사용자가 날짜 / 시간 형식의 자유 형식 디자인을 수행하도록 허용하면 런타임에 해당 DateTime 형식 문자열을 만들어야합니다.
— Pinal 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.