2010-05-11 3 views
6

나는 이런 식으로 밀리 초를 포함하는 문자열을 구문 분석하려고 해요 :밀리 초가 포함 된 DateTime 구문 분석은 특정 문화권에서는 실패합니다. 왜?

string s = "11.05.2010 15:03:08.7718687"; // culture: de-CH 
DateTime d = DateTime.Parse(s); // works 

그러나, 탈 DE 로케일에서 예를 들어, 소수 구분 쉼표 (하지 점)입니다. 그래서 예를 들어이된다 :

string s = "11.05.2010 15:03:08,7718687"; // culture: de-DE (note the comma) 
DateTime d = DateTime.Parse(s); // throws a FormatException 

그것은이 구문 분석을 수행 할 CultureInfo.CurrentCulture를 사용하도록되어로 DateTime.Parse (들)이 지금 FormatException을 던져해야한다고 나에게 이상한입니다. 심지어 CurrentCulture를 인수로 명시 적으로 전달한다고해서 어느 쪽도 도움이되지는 않습니다. 아무도 왜 이것이 효과가 없다는 생각을 가지고 있습니까? 구문 분석하지 않으면 NumberFormatInfo.NumberDecimalSeparator가 고려됩니까?

+1

초 단위 이하의 시간 형식이 표준화되기 전날 (ISO 8601 : 2004) 표준 구분이 적용되기 전날에는 구분 기호가 무엇인지는 중요하지 않았습니다. 따라서 표준은 일반적으로 잠시 후 몇 초 동안 소수점으로 사용해야하는 것을 다루지 않습니다. 숫자 형식 정보가 정확하다는 것은 분명하지 않지만 반드시 더 나은 대안은 아닙니다. 우리는 최근에이 문제와 씨름 해 왔으며 (Windows 플랫폼이 아닌 완전히 다른 맥락에서) 아직 좋은 시스템을 찾지 못했습니다. 후진 (+) 호환성은 우리에게 몇 가지 두통을 안겨줍니다. –

답변

4

DateTimeFormatInfo는 NumberFormatInfo가 아닌 날짜의 서식 지정/구문 분석에 적용됩니다. DateTimeFormatInfo는 다른 문화권에서 오버로드 될 수있는 "초/밀리 초"구분 기호를 정의하지 않습니다.

Standard Date and Time format strings에는 왕복을 제외하고 밀리 초가 표시되지 않으므로 문화적으로 민감하지 않은 것으로 보입니다. 그래서 당신은 자신의 코드가 그것을 생성하지 않는다면, 그 형식의 문자열에 대해서는 일어나지 않아야한다. 코드에서 해당 형식의 날짜를 생성 할 것이라는 것을 알고 있으면 초와 밀리 초 사이의 구분 기호로 쉼표를 사용하는 사용자 지정 형식 문자열을 제공 할 수 있습니다.

+2

실제로 DateTime.Parse 메서드를 반영하면 결국이 코드 조각이 생성됩니다. char ch2 = str.Value [str.Index]; if (ch2 == '.') { ParseFraction (ref str, out raw.fraction); } 나는 이것을 믿을 수 있습니다. ' 항상 올바른 선택이고 밀리 초 단위의 소수점 구분 기호에 대한 공식 표준은 없습니다 (적어도 .NET 세계에서는 그렇지 않습니다) ... – Dejan

관련 문제