programing

날짜 시간.yyyy-dd-MM 형식의 날짜로 구문 분석을 시도합니다.

minimums 2023. 5. 18. 20:52
반응형

날짜 시간.yyyy-dd-MM 형식의 날짜로 구문 분석을 시도합니다.

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

DateTime.TryParse(dateTime, out dt); 

하지만 항상 {1/1/0001 12:00:00 AM}으로 dt가 표시됩니다. 이유와 해당 문자열을 현재 날짜로 변환하는 방법을 알려줄 수 있습니까?

편집: 방금 모든 사람들이 형식 논쟁을 사용하도록 언급된 것을 보았습니다.사용자가 원하는 사용자 지정 날짜 형식을 선택할 수 있는 설정이 있기 때문에 형식 매개 변수를 사용할 수 없으며, 해당 사용자를 기반으로 jQuery datepicker를 통해 해당 형식의 텍스트 상자에 있는 날짜를 자동으로 가져올 수 있습니다.

이 작업은 "2011-29-01 오전 12:00" 예제를 기반으로 수행됩니다.

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

방법을 사용해야 합니다.다음과 같이 날짜 시간 형식을 지정하는 두 번째 인수로 문자열을 사용합니다.

// Parse date and time with custom specifier.
CultureInfo provider = CultureInfo.InvariantCulture;
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);
}                                               

구성 파일 또는 데이터베이스에서 가능한 형식을 읽을 경우, 사용자가 날짜를 입력하려는 모든 다른 방법을 사용할 때 이 형식을 추가할 수 있습니다.

이 방법의 주요 단점은 날짜가 모호하다는 것입니다.형식은 순서대로 시도되므로 미국식(또는 그 반대) 이전에 유럽식 형식을 시도하고 사용자가 미국식 형식 날짜를 입력한다고 생각하더라도 날짜가 13일에서 유럽식 형식 날짜 사이의 모든 항목을 포함합니다.

안전한 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);

msdn의 DateTime에서 시작:

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

의 " " " parseexact " 를 합니다."yyyy-dd-MM hh:mm tt"대신.

작동합니다.

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

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

에게 날짜 형식의 자유 을 하게 날짜/시간 형식에 하는 파일을 DateTime형식 문자열을 지정합니다.

언급URL : https://stackoverflow.com/questions/4718960/datetime-tryparse-issue-with-dates-of-yyyy-dd-mm-format

반응형