2009-09-02 7 views
53

Tôi có chuỗi giống như sau: "9/1/2009". Tôi muốn chuyển đổi nó thành một đối tượng DateTime (sử dụng C#).Tại sao không thể DateTime.ParseExact() phân tích cú pháp "9/1/2009" bằng cách sử dụng "M/d/yyyy"

này hoạt động:

DateTime.Parse("9/1/2009", new CultureInfo("en-US")); 

Nhưng tôi không hiểu tại sao điều này không làm việc:

DateTime.ParseExact("9/1/2009", "M/d/yyyy", null); 

Không có từ nào trong ngày (như "September"), và tôi biết định dạng cụ thể, vì vậy tôi muốn sử dụng ParseExact (và tôi không thấy lý do tại sao CultureInfo là cần thiết). Nhưng tôi tiếp tục nhận được sự sợ hãi "String đã không được công nhận như là một ngoại lệ DateTime hợp lệ".

Cảm ơn

Một chút theo dõi. Dưới đây là 3 cách tiếp cận phù hợp:

DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", null); 
DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture); 
DateTime.Parse("9/1/2009", new CultureInfo("en-US")); 

Và đây là 3 mà không làm việc:

DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.CurrentCulture); 
DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US")); 
DateTime.ParseExact("9/1/2009", "M/d/yyyy", null); 

Vì vậy, Parse() làm việc với "en-US", nhưng không ParseExact ... Bất ngờ?

+0

Bạn đang sử dụng phiên bản .NET nào? Khi tôi thực hiện dòng thứ hai ở trên trong PowerShell v2 trên Win7, nó hoạt động tốt. – Lee

+0

Tôi đang sử dụng .net 3.5 trên xp. Văn hóa mặc định là en-us. – Jimmy

+1

Trong chuỗi '" M/d/yyyy "', mỗi dấu gạch chéo '/' được thay thế bằng chuỗi 'culture.DateTimeFormat.DateSeparator'. Khi bạn cung cấp 'null' làm nhà cung cấp định dạng, văn hóa hiện tại được sử dụng. Bây giờ nó phụ thuộc vào việc văn hóa hiện tại có '"/"' hay một số chuỗi khác (như '" - "' hay '". "') Là ['DateSeparator'] của nó (http://msdn.microsoft.com/) en-us/library/system.globalization.datetimeformatinfo.dateseparator.aspx). –

Trả lời

85

Tôi nghi ngờ vấn đề là các dấu gạch chéo trong chuỗi định dạng so với chuỗi trong dữ liệu. Đó là ký tự phân tách ngày nhạy cảm với văn hóa trong chuỗi định dạng và đối số cuối cùng là null có nghĩa là "sử dụng văn hóa hiện tại". Nếu bạn hoặc thoát khỏi dấu gạch chéo ("M '/' d '/' yyyy") hoặc bạn chỉ định CultureInfo.InvariantCulture, nó sẽ không sao.

Nếu có ai quan tâm trong tái tạo này:

// Works 
DateTime dt = DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", 
            new CultureInfo("de-DE")); 

// Works 
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
            new CultureInfo("en-US")); 

// Works 
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
            CultureInfo.InvariantCulture); 

// Fails 
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
            new CultureInfo("de-DE")); 
+0

Bạn nói đúng, một trong số đó sẽ hoạt động. Tôi không chắc mình thích cái nào hơn. Tôi đoán thoát khỏi slashes là nhỏ gọn hơn ... Cảm ơn, điều này đã được nagging tôi trong một thời gian! – Jimmy

+0

Tôi không chắc tại sao ví dụ thứ hai của bạn lại phù hợp với bạn. Điều đó không hiệu quả với tôi. Sử dụng CultureInfo ("en-US") làm việc với Parse() cho chuỗi ngày tháng này, nhưng không làm việc với ParseExact với chuỗi ngày tháng và chuỗi định dạng này. – Jimmy

+1

@Jimmy: Nó phụ thuộc vào mục đích. Trong trường hợp này,/được sử dụng như một dấu gạch chéo chính xác và * không * như một dấu phân cách nhạy cảm với văn hóa (ngay cả khi văn hóa là 'InvariantCulture'), vì vậy tùy chọn thể hiện ý định của bạn tốt hơn là một dấu gạch chéo được trích dẫn đã chọn). –

2

Hãy thử

Date.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US")) 
+0

Tôi đoán tôi muốn sử dụng DateTime.Parse ("9/1/2009", CultureInfo mới ("en-US")) sau đó, nếu tôi phải chỉ định văn hóa nào ...? – Jimmy

+0

Thay vì khởi tạo phiên bản mới của CultureInfo ("en-US") mỗi khi bạn phân tích cú pháp ngày, hãy sử dụng CultureInfo.InvariantCulture. – Joe

+0

Trên thực tế điều này KHÔNG làm việc (ít nhất là cho tôi?) Sử dụng "en-US" làm việc với Parse, nhưng không phải với ParseExact (cho ngày và định dạng chuỗi) – Jimmy

0

thử này

provider = new CultureInfo("en-US"); 
DateTime.ParseExact("9/1/2009", "M/d/yyyy", provider); 

Bye.

2

Tôi đặt cược văn hóa máy của bạn không phải là "en-US". Từ the documentation:

Nếu cung cấp là một tham chiếu null (Không có gì trong Visual Basic), nền văn hóa hiện nay được sử dụng.

Nếu văn hóa hiện tại của bạn không phải là "en-US" là, điều này sẽ giải thích lý do tại sao nó làm việc cho tôi nhưng không làm việc cho bạn công trình khi bạn chỉ định một cách rõ ràng văn hóa là "en-US" .

+0

Không, thú vị đủ, CultureInfo.CurrentCulture không trả lại "vi-us "... vì vậy tôi không chắc chắn làm thế nào để giải thích lý do tại sao nó sẽ làm việc cho bạn nhưng không phải cho tôi. – Jimmy

+0

Tôi đã thử một vài điều. Dưới đây là những gì hoạt động: DateTime.ParseExact ("9/1/2009", "M '/' d '/' yyyy", null); DateTime.ParseExact ("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture); DateTime.Parse ("9/1/2009", CultureInfo mới ("en-US")); Đây là những gì không hoạt động: Ngày giờ.ParseExact (dateString, "M/d/yyyy", CultureInfo.CurrentCulture); DateTime.ParseExact (dateString, "M/d/yyyy", CultureInfo mới ("en-US")); DateTime.ParseExact (dateString, "M/d/yyyy", null); Vì vậy, Parse() làm việc với "en-US", nhưng không ParseExact ... thú vị huh? – Jimmy

+0

Định dạng Woops bị hỏng. Tôi sẽ thêm vào câu hỏi. – Jimmy

0

Tôi đã thử trên XP và nó không hoạt động nếu PC được đặt thành Giờ quốc tế yyyy-M-d. Đặt một điểm ngắt trên dòng và trước khi nó được xử lý thay đổi chuỗi ngày để sử dụng '-' thay cho '/' và bạn sẽ thấy nó hoạt động. Nó làm cho không có sự khác biệt cho dù bạn có CultureInfo hay không. Có vẻ lạ khi có thể chỉ định định dạng được thử nghiệm chỉ để bỏ qua dấu phân tách.

-2

Đặt thuộc tính Định dạng DateTimePicker thành tùy chỉnh và CustomFormat prperty to M/dd/yyyy.

+1

Câu hỏi này hoàn toàn không liên quan gì đến DateTimePicker. –

-1

Hãy thử:

Cấu hình trong file config web

<system.web> <globalization culture="ja-JP" uiCulture="zh-HK" /> </system.web>

ví dụ: DateTime dt = DateTime.ParseExact ("2013/08/21", "MM/dd/yyyy" , vô giá trị);

url ref: http://support.microsoft.com/kb/306162/

+0

Không có gì trong câu hỏi này đề xuất một ứng dụng web. –