2013-08-28 4 views
2

내 MVC 앱 내에 datepicker 도구를 통해 선택한 날짜 값이있는 여러 가지 양식이 있습니다. 로컬로 디버깅 할 때 잘 작동하지만 클라우드 환경에 배포 할 때 날짜가 올바르게 변환되지 않습니다. 이 등 31/08/2013로 날짜를 가져 와서 다음과 같이 여기에서 내가 날짜 시간으로 변환 된프로덕션 환경으로 이동할 때의 DateTime 문제

string[] uploaddate = form.GetValues("uploaddate"); 
string[] expirydate = form.GetValues("expirydate"); 

:

Convert.ToDateTime(uploaddate[0]); 
Convert.ToDateTime(expirydate[0]); 

이 때 나는 푸른 서버에 배포 나는 다음과 같은 코드가 있습니다 다음 오류가 나타납니다.

문자열이 유효한 DateTime으로 인식되지 않았습니다.

내 응용 프로그램은 영국 형식으로 설계된 반면 인스턴스 이미지에는 미국 문화가 있다고 생각합니다. 사용자의 문화권에 관계없이 정보가 데이터베이스에 저장되도록이 문제를 해결하려면 어떻게해야합니까?

답변

3

나는 날짜 선택을 향상시킬 것입니다. 이 문제를 클라이언트 문제, (정말입니다) 서버가 아닌 하나의

내가 몇 가지 조사 Convert.ToDateTime을 (했던

UPDATE) 단순히 현재 문화권 설정을 DateTime.Parse 호출을 . 난 그냥 내 VM 중 하나를 확인했습니다 그리고 그것은 왜 당신이 d/M/y와 함께 오류를 받고있어 미국의 로컬 설정과 함께 실행됩니다. 나는 서버에 보내지는 날짜의 형식을 standarise 할 것이다. (어떤 형식이든 상관 없지만, 나는 항상 YMD의 팬이다.) 그리고 DateTime.TryParseExact()를 사용한다. @No One이 언급한다. 하나의 포맷만으로 가능합니다.

+0

이것이 내가 시도 할 해결책이라고 생각합니다. 왜 yyyy-MM-dd에 게시하면 변환하기가 더 쉬워 집니까? 그리고 문화를 어떻게 활용할 수 있을까요? – Jay

+0

yyyy-MM-dd는 모호성을 제거하는 ISO 8601 날짜 형식의 하위 부분입니다. 기본적으로 nnnn-nn-nn의 패턴은 항상 yyyy-MM-dd로 구문 분석됩니다. –

+0

yyyy-MM-dd HH : mm : ss? Windows Azure cloudapp를 통해 하늘색 데이터베이스에 업로드하고 있지만 날짜 형식을 어떻게 지정했는지에 상관없이 올바르지 않은 DateString 형식 오류가 발생하는 것으로 보입니다. – Jay

0

Convert.ToDateTime의 오버로드를 사용하면 문화권을 지정할 수 있습니다. 이것은 귀하의 요구 사항 인 경우 영국 문화를 항상 사용하도록 강요 할 것입니다.

1

DateTime.TryParseExact을 사용해야합니다. 가능한 모든 형식을 지정할 수 있으며 예외를 throw하지 않습니다.

MSDN의 예제. 그것은 다시 게시 값은 항상 YYYY-MM-DD입니다하지만 당신이 걱정하는 중 문화에 표시되도록

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"}; 
string[] dateStrings = {"5/1/2009 6:32 PM", "05/01/2009 6:32:05 PM", 
         "5/1/2009 6:32:00", "05/01/2009 06:32", 
         "05/01/2009 06:32:00 PM", "05/01/2009 06:32:00"}; 
DateTime dateValue; 

foreach (string dateString in dateStrings) 
{ 
    if (DateTime.TryParseExact(dateString, formats, 
           new CultureInfo("en-US"), 
           DateTimeStyles.None, 
           out dateValue)) 
     Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue); 
    else 
     Console.WriteLine("Unable to convert '{0}' to a date.", dateString); 
} 
+1

이 접근법의 위험은 2013 년 8 월 5 일 8 월 5 일 (미국에서 2013 년 8 월 5 일)과 같은 날짜가 모호 할 수 있다는 것입니다. 이러한 날짜는 2013 년 5 월 8 일에 "연못을 가로 질러"길을 잘못 파싱 될 수 있으며 아무도 현명하지 못합니다. –

관련 문제