3

WindowsPhoneに日と月のみの日付を表示する必要があります。

たとえば、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

左側の列には、アプリがサポートする国がいくつか含まれています。右側の列には、日付テキストをどのようにするかが示されています。

これを達成するための一般的な方法はありますか?

4

2 に答える 2

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)

*/
于 2012-08-13T15:13:25.657 に答える
4

うわー、その質問は特に興味深いです!明らかな解決策が見つからなかったので、次のようにします。

    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が正しく述べたように、このソリューションにも欠陥があります(実際に予想していたよりもはるかに多く)。完全なテスト スイートは次のとおりです (コンソール アプリケーションとしてコンパイル)。

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 の限られたフレームワークも複雑さを増しています)、そのような日付表現が一部の文化で意味があるかどうかは明らかではありません。たとえば、一部のカルチャでは、日付部分の区切り記号は 2 文字のシーケンスです。

hu-HU, 2012.08.14. → 08.14

08. 14実際によく見えますか?それともそうあるべき08. 14.ですか?わからない。私があなたで、本当に最大量の文化を処理したい場合は、標準の「d」形式指定子をそのまま使用します。

于 2012-08-13T15:27:39.973 に答える