2015-02-03 7 views
0

ParseExact() 메서드를 사용하여 문자열을 DateTime으로 구문 분석하려고합니다.사용자 지정 DateTime 문자열 구문 분석

string input = "Wednesday, March 4, 2015 - 9:00 AM PST"; 
string format = @"dddd, MMMM d, yyyy - h:mm tt \P\S\T"; 

이 입력을이 형식으로 구문 분석하지 못하고 왜 잘못되었는지 알 수 없습니다. 제가

Console.WriteLine(DateTime.Now.ToString(format)); 

할 경우

그러면 I는 상기 입력과 같은 형식의 출력을 얻는다. 따라서 형식이 실제로 올바른 것입니다. 의견을 감사합니다

- Saqib

+2

은 '\\ P \\ S \\ T'을 사용하여 정상적으로 구문 분석합니다. – Plutonix

+1

왜 사용하고 있습니까? '\\'앞에 P, S, T? 백 슬래시가 사용될 때 컴파일되지 않습니다. 역 슬래시가 제거되면 모두 잘 작동합니다. – dotnetom

+0

- OP는'@ "..."을 사용하여 컴파일되므로 "\"은 "ParseExact"에 의해 "다음 문자를 명시 적으로 처리"로 보존되고 사용됩니다. 귀하의 언어/국가가 "en-US"(또는 "en-US"에 가까운 서식 옵션이있는 "en-") 인 한 제 답변은 "모든 것이 잘 작동합니다"라고 표시하므로 다른 곳에서는 실패합니다. –

답변

4

현재 로케일 문제 (또는 주/월 번역 더 구체적 일) : 약자로

var ok = DateTime.ParseExact(
    "Wednesday, March 4, 2015 - 9:00 AM PST", "dddd, MMMM d, yyyy - h:mm tt PST", 
     new CultureInfo("en-us")) 
var failed = DateTime.ParseExact(
    "Wednesday, March 4, 2015 - 9:00 AM PST", "dddd, MMMM d, yyyy - h:mm tt PST", 
     new CultureInfo("de-de")) 
+1

+1하지만 "주간/월간 번역 일"이 유일한 잠재적 문제는 아닙니다. "h : mm"은 콜론 이외의 다른 문화권 TimeSeparator를 기대합니다. OP는 CultureInfo.InvariantCulture를 지정해야합니다. – Joe

+0

@Joe - 좋은 점 ('tt'도 다릅니다 ...) - 올바른 (아마도 불변의) 문화를 명시 적으로 지정하는 것이 해결책입니다. –

0

, 당신의 예제 코드는 탈출로, 컴파일되지 않습니다 char '\'자체를 이스케이프 처리해야합니다. 또는 형식 문자열 앞에 '@'를 붙여 리터럴로 만들 수 있습니다.

다음 작품;

string input = "Wednesday, March 4, 2015 - 9:00 AM PST"; 
string format = @"dddd, MMMM d, yyyy - h:mm tt \P\S\T"; 
DateTime dt = DateTime.ParseExact(input, format, null, DateTimeStyles.AssumeLocal); 

그러나, 당신은 날짜 시간 인스턴스가 어떤 시간대 정보를 포함하지 않는 것을 알고 있어야합니다, 그래서 결과는 현지 시간으로 간주한다 (I 명시 적으로 언급 이유입니다 그 ParseExact 호출에서), 그리고 'PST'는 시간대로 인식되지 않습니다. TimeTimeOffset 유형 (TimeZone 세부 정보 포함)을 사용 했더라도