2010-05-11 8 views
6

Tôi đang cố gắng để phân tích một chuỗi chứa mili giây như thế này:Phân tích cú pháp một DateTime chứa mili giây không thành công cho một số nền văn hóa nhất định. Tại sao?

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

Tuy nhiên, ví dụ dưới locale de-DE, tách thập phân là dấu phẩy (không phải là một dấu chấm). Vì vậy, ví dụ trở thành:

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

Đó là lạ với tôi rằng DateTime.Parse (s) nên ném một FormatException bây giờ vì nó là nghĩa vụ phải sử dụng CultureInfo.CurrentCulture để làm phân tích cú pháp. Ngay cả việc vượt qua CurrentCulture như một đối số một cách rõ ràng cũng không giúp gì cả. Có ai có một ý tưởng tại sao điều này không hoạt động? Không phân tích cú pháp lấy NumberFormatInfo.NumberDecimalSeparator vào tài khoản?

+1

Trong những ngày trước khi định dạng thời gian phụ thứ hai được chuẩn hóa (ISO 8601: 2004 đã làm), thì không quan trọng dấu phân tách là gì. Vì vậy, các tiêu chuẩn thường không bao gồm những gì nên được sử dụng như là điểm thập phân cho lần thứ hai. Nó không phải là rõ ràng rằng thông tin định dạng số là chính xác, nhưng không nhất thiết phải là một lựa chọn tốt hơn. Chúng tôi đã vật lộn với vấn đề này gần đây (trong một bối cảnh hoàn toàn khác - không phải nền tảng Windows), và chưa đưa ra một hệ thống tốt cho nó. Cộng với khả năng tương thích ngược (in) cho chúng ta một vài nhức đầu. –

Trả lời

4

DateTimeFormatInfo áp dụng cho định dạng/phân tích ngày, không phải NumberFormatInfo. DateTimeFormatInfo không xác định dấu phân cách "giây/mili giây" có thể bị quá tải bởi các nền văn hóa khác nhau.

Không ai trong số Standard Date and Time format strings hiển thị mili giây, ngoại trừ khứ hồi, dường như không có văn hóa nhạy cảm. Vì vậy, bạn không nên xảy ra khi một chuỗi trong định dạng đó, trừ khi mã của riêng bạn đang tạo ra nó. Nếu bạn biết mã của mình sẽ tạo ngày tháng theo định dạng đó, bạn có thể cung cấp chuỗi định dạng tùy chỉnh sử dụng dấu phẩy làm dấu phân cách giữa giây và mili giây.

+2

Thật vậy, phản ánh phương thức DateTime.Parse cuối cùng dẫn đến đoạn mã này: char ch2 = str.Value [str.Index]; if (ch2 == '.') { ParseFraction (ref str, out raw.fraction); } Điều này cho phép tôi tin rằng '.' luôn là lựa chọn đúng và không có tiêu chuẩn chính thức nào cho dấu phân cách thập phân trong mili giây (ít nhất là không có trong thế giới .NET) ... – Dejan