2011-10-24 22 views
7

Trang web của tôi được lưu trữ trên nhiều máy chủ tại các địa điểm khác nhauDateTime vấn đề khi nền văn hóa toàn cầu của máy chủ là khác nhau trên các máy chủ khác nhau

Everywhere văn hóa của các định dạng dữ liệu là different- chúng tôi sử dụng định dạng mm/dd/yyyy mọi nơi nhưng trong trường hợp một số máy chủ có văn hóa được đặt thành dd/mm/yyyy thì trang web của chúng tôi tạo ra ngoại lệ Ngày giờ.

+4

Cho người đã bỏ phiếu vì "rất khó để nói những gì được hỏi ở đây": điều gì khiến bạn khó hiểu? –

Trả lời

11

Bạn nên chỉ định văn hóa nào bạn muốn sử dụng bất cứ khi nào bạn chuyển đổi chuỗi thành một ngày.

Văn hóa bạn nên sử dụng tùy thuộc vào văn hóa ngày được định dạng là.Ví dụ, nếu tất cả các ngày bạn đang phân tích được định dạng như Slovak:

String s = "24. 10. 2011"; 

Sau đó, bạn cần phải phân tích chuỗi như thể đó là trong Slovak (Slovakia) (sk-SK) văn hóa:

//Bad: 
d = DateTime.Parse(s); 

//Good: 
d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("sk-SK")); //Slovak (Slovakia) 

Nếu ngày của bạn là tất cả trong Tajik (Tajikistan Cyrillic), thì bạn cần phải phân tích nó như tg-Cryl-Tj:

String s = "24.10.11" 

DateTime d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("tg-Cryl-Tj")); 

Điều gì dẫn đến câu hỏi: bạn đang sử dụng định dạng ngày nào? Bạn không nên dựa vào thiết lập miền địa phương của máy chủ, bạn nên quyết định định dạng nào bạn muốn.

//Bad 
String s = d.ToString(); 

//Good 
String s = d.ToString(CultureInfo.CreateSpecificCulture("si-LK")); //Sinhala (Sri Lanka) 

//s = "2011-10-24 12:00:00 පෙ.ව." 

tôi nghi ngờ bạn thích làm mọi thứ bằng tiếng Anh. Nhưng sau đó bạn phải quyết định mà biến thể của tiếng Anh:

  • en-AU (tiếng Anh Austrailia): 24/10/2011
  • en-IA (tiếng Anh Ấn Độ): 24-10-2011
  • en-ZA (Anh Nam Phi): 2011/10/24
  • en-US (Tiếng Anh Hoa Kỳ): 10/24/2011

tôi nghi ngờ bạn thích Tiếng Anh (Ấn Độ) (en-IA).


Nhưng nếu bạn thực sự không thể quyết định những gì văn hóa để sử dụng khi chuyển đổi ngày để dây và ngược lại, và những ngày không bao giờ có nghĩa là để được hiển thị cho người dùng, sau đó bạn có thể sử dụng Invariant Văn hóa:

String s = "10/24/2011" //invariant culture formatted date 

d = DateTime.Parse(s, CultureInfo.InvariantCulture); //parse invariant culture date 

s = d.ToString(CultureInfo.InvariantCulture); //convert to invariant culture string 
+0

cảm ơn lời giải thích tuyệt vời – Murtaza

+1

Bạn không bao giờ nên sử dụng bất kỳ cài đặt văn hóa nào từ miền hoặc os. Nếu bất cứ ai ghi đè những lý do này (vì một ứng dụng khác không hoạt động chính xác), ứng dụng của bạn sẽ ngừng hoạt động. Nếu định dạng luôn giống nhau, bạn nên sử dụng tryparseexact hoặc parseexact. – Peter

+0

Để tất cả điều này, trên windows 10 là định dạng ngày sk mặc định mới không có dấu cách. – Fanda

0

Không bao giờ dựa vào ngôn ngữ mặc định của máy chủ. Đối với trường hợp của bạn, điều này có nghĩa là:

  • Sử dụng báo cáo nơi bạn vượt qua ngày như đối tượng (chưa định dạng) ngày và không phải là (định dạng) đối tượng chuỗi chuẩn bị. Bạn không bao giờ nên sử dụng chuỗi để biểu thị ngày trong ứng dụng của mình, vì bạn không thể thực hiện các hàm cụ thể theo ngày trên chúng (như thêm 1 tháng, nhận ngày cuối cùng của tuần hiện tại, v.v.)

  • Sử dụng các hàm SQL như to_dateto_char ở khắp mọi nơi (tên chính xác phụ thuộc vào DBMS của bạn), nếu bạn thực sự cần sử dụng đối tượng chuỗi trong ứng dụng của bạn

+0

giải pháp đơn giản và sự hiểu biết cảm ơn, nhưng Ian Boyd đã giải thích lý do tại sao chúng ta nên làm việc trên phân tích cú pháp này. Cám ơn hai bạn. – Murtaza

1

Không bao giờ, bao giờ hết, ngày cửa hàng nội bộ như dây đàn. Không có trong cơ sở dữ liệu, không có trong ứng dụng của bạn.

Nếu bạn cần di chuyển giá trị ngày giữa các máy chủ, hãy chuyển sang nhị phân. Hoặc nếu bạn thực sự thực sự phải sử dụng chuỗi, hãy sử dụng ToString(CultureInfo.InvariantCulture) - hoặc chỉ cần tuần tự hóa thuộc tính Ticks.

Ngoài ra, không bao giờ chuyển ngày tháng làm chuỗi cho cơ sở dữ liệu bằng cách sử dụng các lệnh SQL mà bạn tạo bằng mã. Sử dụng SqlParameter cho điều đó, hoặc thậm chí tốt hơn, dựa vào một số O/R Mapper, chẳng hạn như khung thực thể hoặc LINQ to SQL.

0

Nếu được triển khai cho máy chủ không thuộc quyền kiểm soát của bạn, điều quan trọng là phải đảm bảo mã của bạn không có phụ thuộc được mã hóa cứng trên nền văn hóa.

Bạn rất có thể muốn tìm kiếm mã của mình cho DateTime.Parse hoặc tương tự. Chúng tôi có một tập hợp các phương pháp mở rộng trên DateTime mà chúng tôi sử dụng để thay thế cho văn hóa chính xác.

Các vấn đề liên quan