2012-01-09 24 views
7

Trong .NET, hầu hết các chuỗi chuẩn được sử dụng để định dạng giá trị DateTime là nhận biết văn hóa, ví dụ: chuỗi định dạng ShortDatePattern ("d") chuyển thứ tự của năm/tháng/phụ ngày quanh tùy thuộc vào văn hóa hiện tại:Định dạng ngày nhận thức văn hóa tùy chỉnh trong .NET

6/15/2009 1:45:30 PM -> 6/15/2009 (en-US) 
6/15/2009 1:45:30 PM -> 15/06/2009 (fr-FR) 
6/15/2009 1:45:30 PM -> 15.06.2009 (de-DE) 

tôi cần một cái gì đó tương tự cho một định dạng ngày chỉ chứa tháng và trong ngày:

6/15/2009 1:45:30 PM -> 6/15 (en-US) 
6/15/2009 1:45:30 PM -> 15/06 (fr-FR) 
6/15/2009 1:45:30 PM -> 15.06. (de-DE) 

Sử dụng ví dụ chuỗi định dạng tùy chỉnh "MM/dd" không hoạt động; nó sẽ hiển thị không chính xác "01.11" cho ngày 11 tháng 1 trong văn hóa Đức, khi tôi muốn nó hiển thị "11.01".

Tôi làm cách nào để tạo chuỗi định dạng tùy chỉnh theo thứ tự các phần ngày tháng?

Trả lời

2

Giả sử tất cả các nền văn hóa thông qua sẽ có một ShortDatePattern chứa M hoặc MMd hoặc dd ở một số đơn đặt hàng với một số loại phân cách (Tôi không thể nghĩ ra một ngoại lệ cho lịch Gregorian, nhưng tôi có thể là sai) sau đó sau đây sẽ làm việc:

private static string FindMonthDayOnly(System.Globalization.CultureInfo ci) 
{ 
    string shortPattern = ci.DateTimeFormat.ShortDatePattern; 
    while(shortPattern[0] != 'd' && shortPattern[0] != 'M') 
    { 
    shortPattern = shortPattern.Substring(1); 
    if(shortPattern.Length == 0) 
     return ci.DateTimeFormat.ShortDatePattern; 
    } 
    while(shortPattern[shortPattern.Length - 1] != 'd' && shortPattern[shortPattern.Length - 1] != 'M') 
    { 
    shortPattern = shortPattern.Substring(0, shortPattern.Length - 1); 
    if(shortPattern.Length == 0) 
     return ci.DateTimeFormat.ShortDatePattern; 
    } 
    return shortPattern; 
} 

Nếu giả định là rất xa mis-phù hợp, sau đó nó sẽ trở lại ShortDatePattern, mặc dù nó cũng có thể kết thúc hiển thị chỉ là ngày hay chỉ là tháng.

Lỗi không chính xác bao gồm dấu tách ở cuối hoặc các chỉ báo khác khi thích hợp. Ví dụ: nó biến định dạng chuẩn (yyyy-MM-dd) thành MM-dd thay vì --MM-dd, là định dạng chuẩn cho các kết hợp theo ngày không có năm.

+0

Tôi thích ý tưởng - mặc dù sẽ không đơn giản loại bỏ bất kỳ thứ gì không có trong '['M', 'd', '/']' và cắt tỉa '/ 'từ kết quả là đủ? – Oded

+0

@Oded. Đó là khá nhiều những gì ở trên không. –

+0

@Oded oh chờ đợi, có một sự khác biệt, nhưng nó là một tích cực, điều này sẽ giữ bất cứ điều gì đó là giữa tháng và ngày đó không phải là '/' mà trong khi không cần phải có như vậy ('/' nên làm việc như một dấu tách thích hợp) có một số định dạng có dấu phân cách cục bộ được mã hóa trực tiếp thay vì bằng cách sử dụng '/'. –

3

Khi sử dụng một chuỗi định dạng tùy chỉnh, bạn chỉ định các phần chính xác mà bạn cần và vị trí trong chuỗi mà chúng cần. Đây chính xác là những gì đang xảy ra.

Chuỗi định dạng mà bạn có biết về văn hóa đã có, như giữ chỗ ngày separator (/) thực sự được xuất ra ký tự chính xác - một ..

Ngoài việc xây dựng các chuỗi định dạng tùy chỉnh khác nhau cho phù hợp với các nền văn hóa khác nhau, bạn không thể làm gì khác.

Điều này có thể được đặt trong tệp tài nguyên để quốc tế hóa hoặc được giữ trong từ điển chẳng hạn.

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