developer tip

유효한 형식을 거부하는 DateTime.TryParseExact ()

copycodes 2021. 1. 7. 08:07
반응형

유효한 형식을 거부하는 DateTime.TryParseExact ()


ASP.NET WebForms페이지 에서 DateTime 값을 구문 분석하고 DateTime.TryParseExact()있으며 제공된 형식 문자열 중 하나와 명확하게 일치하더라도 날짜 문자열이 메서드에 의해 계속 거부됩니다 .

집에있는 개발 머신에서는 실패한 것 같지만 프로덕션 서버에서는 작동하므로 로컬 날짜 설정이 관련되어 있다고 생각하고 있지만이 오류는 IFormatProvider (CultureInfo)개체를 매개 변수로 제공하더라도 발생합니다.

코드는 다음과 같습니다.

DateTime startDate;
string[] formats = { "dd/MM/yyyy", "dd/M/yyyy", "d/M/yyyy", "d/MM/yyyy",
                    "dd/MM/yy", "dd/M/yy", "d/M/yy", "d/MM/yy"};

var errStart = row.FindControl("errStartDate"); //my date format error message
if (!DateTime.TryParseExact(txtStartDate.Text, formats, null, DateTimeStyles.None, out startDate))
{
    errStart.Visible = true; //we get here even with a string like "20/08/2012"
    return false;
}
else
{
    errStart.Visible = false;
}

참고 null FormatProvider위의 a 제공하고 있지만 이 매개 변수 CultureInfo와 같은 객체를 제공 할 때 동일한 문제가 발생합니다 (CultureInfo provider = new CultureInfo("en-US")).

내가 무엇을 놓치고 있습니까?


시험:

 DateTime.TryParseExact(txtStartDate.Text, formats, 
        System.Globalization.CultureInfo.InvariantCulture,
        System.Globalization.DateTimeStyles.None, out startDate)

여기에서 몇 가지 사항을 확인할 수 있습니다.

  1. 올바르게 사용하고있는 날짜 형식. 에 대해 둘 이상의 형식을 제공 할 수 있습니다 DateTime.TryParseExact. 여기 에서 사용할 수있는 전체 형식 목록을 확인 하십시오 .
  2. CultureInfo.InvariantCulture문제를 추가 할 가능성이 더 높습니다. 따라서 NULL을 전달 하거나로 설정 하는 대신 CultureInfo provider = new CultureInfo("en-US")다음과 같이 작성할 수 있습니다. .

    if (!DateTime.TryParseExact(txtStartDate.Text, formats, 
                    System.Globalization.CultureInfo.InvariantCulture,
                    System.Globalization.DateTimeStyles.None, out startDate))
    {
        //your condition fail code goes here
        return false;
    }
    else
    {
        //success code
    }
    

이것은 간단한 방법입니다. ParseExact 사용

CultureInfo provider = CultureInfo.InvariantCulture;
DateTime result;
dateString = "Sun 08 Jun 2013 8:30 AM -06:00";
format = "ddd dd MMM yyyy h:mm tt zzz";
result = DateTime.ParseExact(dateString, format, provider);

이것은 당신을 위해 작동합니다.


C # 7.0 사용해보기

var Dob= DateTime.TryParseExact(s: YourDateString,format: "yyyyMMdd",provider: null,style: 0,out var dt)
 ? dt : DateTime.Parse("1800-01-01");

string DemoLimit = "02/28/2018";
 string pattern = "MM/dd/yyyy";
 CultureInfo enUS = new CultureInfo("en-US"); 
 DateTime.TryParseExact(DemoLimit, pattern, enUS, 
                     DateTimeStyles.AdjustToUniversal, out datelimit);

자세한 내용은 https://msdn.microsoft.com/en-us/library/ms131044(v=vs.110).aspx

참조 URL : https://stackoverflow.com/questions/11999912/datetime-tryparseexact-rejecting-valid-formats

반응형