날짜가 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.