3

我需要在windows phone上僅顯示日期和月份的某些日期。如何顯示基於文化的日期和月份的日期字符串?

例如,1月1日,對於美國用戶,我希望文本爲'1/31',對於英國用戶,我希望它爲'31/1'。

什麼是最簡單的方法來實現這樣的事情?

更新: 我的應用程序將在很多國家提供。我是否必須指定每種文化以獲得我想要的?

例如,

de-DE Culture       01.10 
en-US Culture       10/1 
es-ES Culture       01/10 
fr-FR Culture       01/10 

左邊一欄包含了一些國家我的應用程序將支持,右欄是我多麼希望我的日期文本是。

有沒有什麼通用的方法可以實現這個目標?

+0

在解析DateTime時不能指定CultureInfo嗎? – h1ghfive 2012-08-13 15:06:09

回答

2

哇,這個問題特別有趣!我沒有發現一些明顯的解決方案,所以這裏有雲:

char[] trimmer = DateTimeFormatInfo.CurrentInfo.DateSeparator.ToCharArray(); 
    string dateStr = date.ToString("d").Replace(date.ToString("yyyy"), string.Empty).Trim(trimmer); 

如果您不能使用DateTimeFormatInfo,然後下面的代碼應該做的伎倆:

string tmp = date.ToString("d").Replace(date.ToString("yyyy"), string.Empty); 
char last = tmp[tmp.Length - 1]; 
char[] trimmer = char.IsDigit(last) ? new char[] { tmp[0] } : new char[] { last }; 
string dateStr = tmp.Trim(trimmer); 

由於@ken2k正確提到的,這解決方案也存在缺陷(並且比我預期的要多得多)。這裏是complere測試套件(compile as console application):

using System; 
using System.Diagnostics; 
using System.Globalization; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures); 

     DateTime date = DateTime.Now; 

     foreach (CultureInfo culture in cultures) 
     { 
      string tmp = date.ToString("d", culture).Replace(date.ToString("yyyy", culture), string.Empty); 
      char last = tmp[tmp.Length - 1]; 
      char[] trimmer = char.IsDigit(last) ? new char[] { tmp[0] } : new char[] { last }; 
      string dateStr = tmp.Trim(trimmer); 

      Console.WriteLine(string.Format("{0,12}, {1,15} => {2,10}", culture.IetfLanguageTag, date.ToString("d", culture), dateStr)); 
     } 

     if (Debugger.IsAttached) 
     { 
      Console.WriteLine(); 
      Console.WriteLine("Press any key to exit.."); 
      Console.ReadKey(); 
     } 
    } 
} 

進一步優化是可能的(至少在完整的框架),但它變得相當複雜(一款Windows Phone的有限框架增加了複雜性也),它目前尚不清楚這種日期表示在某些文化中是有意義的。例如,在一些培養物中日期部分分離器是一個兩字符序列:

HU-HU,2012。08. 14 => 14 08.

08. 14並實際上看起來好?或者應該是08. 14.?我不確定。如果我是你,而且我真的想處理最大量的文化,我會堅持使用標準的「d」格式說明符。

+0

+1我喜歡你的答案!不過,我無法使用修剪功能,因爲wp7中不支持DateSeparator。 :(但它很容易修復我可以只使用一個子字符串函數來擺脫最後一個字符。如果我在幾個小時內沒有收到任何更好的答案,我很高興接受你的答案:) – Jessica 2012-08-13 15:49:05

+0

你不應該刪除最後字符,因爲年可以在月前(例如在日本)。查看更新的答案。 – 2012-08-13 16:02:39

+1

您不應使用字符串函數(如「替換」,「修剪」等)進行格式化日期。有很多不同的文化形式,你不能考慮所有的情況。例如,你的代碼假設'date.ToString(「d」)''''''''''''''對於所有的文化來說,總是包含'yyyy'形式的年份,這不是真的(例如測試''kn-IN''')。 – ken2k 2012-08-13 16:10:16

5
// 13 August 
string americanDate = theDate.ToString("m", new CultureInfo("en-us")); 

// August 13 
string ukDate = theDate.ToString("m", new CultureInfo("en-gb")); 

有關可用格式的完整列表,請參閱MSDN

編輯:

在您的應用程序,不用手動指定CultureInfo實例:使用默認的培養DateTime.ToString,這是執行的線程的文化。

所以,你的代碼就變成了:

string cultureSpecificDate = theDate.ToString("m"); 

其中"m"是你可用的格式列表中選擇一個日期格式。你想要的那個看起來不是由DateTimeFormatInfo類提供的標準。你不能在下面的列表中選擇一個受支持的模式嗎?

/* 
This code produces the following output. 

FORMAT en-US EXAMPLE 
CHAR VALUE OF ASSOCIATED PROPERTY, IF ANY 

    d  1/3/2002 
     M/d/yyyy (ShortDatePattern) 

    D  Thursday, January 03, 2002 
     dddd, MMMM dd, yyyy (LongDatePattern) 

    f  Thursday, January 03, 2002 12:00 AM 

    F  Thursday, January 03, 2002 12:00:00 AM 
     dddd, MMMM dd, yyyy h:mm:ss tt (FullDateTimePattern) 

    g  1/3/2002 12:00 AM 

    G  1/3/2002 12:00:00 AM 

    m  January 03 
     MMMM dd (MonthDayPattern) 

    M  January 03 
     MMMM dd (MonthDayPattern) 

    o  2002-01-03T00:00:00.0000000 

    r  Thu, 03 Jan 2002 00:00:00 GMT 
     ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (RFC1123Pattern) 

    R  Thu, 03 Jan 2002 00:00:00 GMT 
     ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (RFC1123Pattern) 

    s  2002-01-03T00:00:00 
     yyyy'-'MM'-'dd'T'HH':'mm':'ss (SortableDateTimePattern) 

    t  12:00 AM 
     h:mm tt (ShortTimePattern) 

    T  12:00:00 AM 
     h:mm:ss tt (LongTimePattern) 

    u  2002-01-03 00:00:00Z 
     yyyy'-'MM'-'dd HH':'mm':'ss'Z' (UniversalSortableDateTimePattern) 

    U  Thursday, January 03, 2002 8:00:00 AM 

    y  January, 2002 
     MMMM, yyyy (YearMonthPattern) 

    Y  January, 2002 
     MMMM, yyyy (YearMonthPattern) 

*/ 
+0

請看我更新的問題。 – Jessica 2012-08-13 15:24:10

+0

@Jessica請參閱更新的回答 – ken2k 2012-08-13 15:36:10

+1

我真的很喜歡當我的答案downvoted沒有任何評論解釋... – ken2k 2012-08-13 15:40:26

相關問題