2012-05-17 39 views
6

Tôi đã tạo một ứng dụng C# WinForms.Hành vi kỳ lạ của DateTime

Trên máy tính của tôi các công việc sau:

DateTime.ParseExact("13/05/2012", "dd/mm/yyyy", null) 

nhưng điều này không:

DateTime.Parse("13/05/2012") 

Trên các máy tính khách hàng của tôi nó bị đảo ngược. Đây hoạt động:

DateTime.Parse("13/05/2012") 

nhưng điều này không:

DateTime.ParseExact("13/05/2012", "dd/mm/yyyy", null) 

Các trạng thái lỗi:

String was not recognized as a valid DateTime. 

Không quản lý để tìm thấy bất kỳ thông tin trên internet về vấn đề này. Chương trình sử dụng .Net Framework 4 và là một ứng dụng x86. Tôi chạy Windows 8 x64, máy khách chạy Windows 7 x64.

Có ai có manh mối về lý do tại sao điều này xảy ra không?

Cảm ơn.

+2

Tôi nghi ngờ có sự khác biệt liên quan đến định dạng ngày giờ CultureInfo của hệ thống, nhưng hãy giải thích về ý nghĩa "không hoạt động". Nó có tạo ra lỗi không? Thông báo lỗi là gì? –

+1

@DanJ Nó hoạt động cho anh ta, nhưng nó phân tích nó là "13/05/2012" tại máy tính của khách hàng khi sử dụng phương thức 'ParseExact'. Tôi đồng ý kiểm tra trên CultureInfo. – SimpleVar

+4

Một lý do khác để chuẩn hóa định dạng ISO 'yyyy-MM-dd'. =) – MCattle

Trả lời

12

Lý do bạn nhận được hành vi khác nhau trên các máy tính khác nhau là do chúng đang chạy với các nền văn hóa khác nhau. Thử chạy dòng mã này trên cả hai máy tính để xem nếu nó ra một cái gì đó khác nhau: (ideone)

System.Console.WriteLine(CultureInfo.CurrentCulture); 

Output (ví dụ):

 
en-US 

Văn hóa xác định nhiều yếu tố, một trong số đó là các dấu phân cách ngày . Nếu bạn muốn hành vi phù hợp cho tất cả người dùng, hãy thử xác định một nền văn hóa: (ideone)

CultureInfo cultureInfo = CultureInfo.InvariantCulture; // or whatever you prefer 
DateTime dateTime = DateTime.ParseExact("13/05/2012", "dd/MM/yyyy", cultureInfo); 

Đoạn mã trên giả sử bạn có các báo cáo sử dụng:

using System; 
using System.Globalization; 
+4

'mm' là phút, không phải tháng, bạn đang tìm kiếm' MM'. Như ví dụ của bạn cho thấy. – Guvante

+0

@Guvante: Cảm ơn, tôi đã sửa nó. –

+0

Làm việc như một sự quyến rũ! Cảm ơn rất nhiều! –

11

Hãy cẩn thận; trong custom date and time format strings, thông số số mm đại diện cho "phút", không phải là "tháng". Bạn cần sử dụng MM trong nhiều tháng.

DateTime.ParseExact("13/05/2012", "dd/MM/yyyy", CultureInfo.InvariantCulture) 
+0

Tôi không biết về điều này, cảm ơn bạn! –