날짜 시간.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
'programing' 카테고리의 다른 글
Bash 명령줄 및 입력 제한 (0) | 2023.05.18 |
---|---|
코드 파일 대 코드 이면 (0) | 2023.05.18 |
WPF 셸 통합 라이브러리를 사용하여 최대화할 경우 창이 화면 밖으로 이동합니다. (0) | 2023.05.18 |
파일에 쓰지만 파일이 있는 경우 덮어씁니다. (0) | 2023.05.18 |
엑셀에서 두 날짜 타임스탬프의 시간과 분의 차이를 얻는 방법은 무엇입니까? (0) | 2023.05.18 |