22

曜日なしで長い日時を取得するロケール対応の方法を探しています。そのような獣は存在しますか?

以下は、平日を含む長い日付形式を取得するために使用するコードです。

DateTime time = ...
String formattedDate = time.ToLongDateString();

編集

私が見たいものの例:

  • ja: 2009 年 12 月 5 日
  • fr-fr: 2009 年 12 月 5 日
  • es-es: 2009 年 2 月 5 日

ToLongDateString() は次を返します。

  • en-us: 2009 年 12 月 5 日土曜日
  • fr-fr: samedi 2009 年 12 月 5 日
  • es-es: sábado, 2009 年 2 月 5 日
4

16 に答える 16

11

これはトリックを行うように見えました。

  1. 有効なすべての日時パターンを列挙します: CultureInfo.DateTimeFormat.GetAllDateTimePatterns
  2. 次の最長のパターンを選択します (おそらくこれが最適です)。
    • CultureInfo.DateTimeFormat.LongDatePattern の部分文字列です
    • 「ddd」(短い曜日名)を含まない
    • 「dddd」(長い曜日名)を含まない

これは、私が探していた文字列を思いついたようです。

以下のコードを参照してください。

class DateTest
{
    static private string GetDatePatternWithoutWeekday(CultureInfo cultureInfo)
    {
        string[] patterns = cultureInfo e.DateTimeFormat.GetAllDateTimePatterns();

        string longPattern = cultureInfo.DateTimeFormat.LongDatePattern;

        string acceptablePattern = String.Empty;

        foreach (string pattern in patterns)
        {
            if (longPattern.Contains(pattern) && !pattern.Contains("ddd") && !pattern.Contains("dddd"))
            {
                if (pattern.Length > acceptablePattern.Length)
                {
                    acceptablePattern = pattern;
                }
            }
        }

        if (String.IsNullOrEmpty(acceptablePattern))
        {
            return longPattern;
        }
        return acceptablePattern;
    }

    static private void Test(string locale)
    {
        DateTime dateTime = new DateTime(2009, 12, 5);

        Thread.CurrentThread.CurrentCulture  = new CultureInfo(locale);

        string format = GetDatePatternWithoutWeekday(Thread.CurrentThread.CurrentCulture);

        string result = dateTime.ToString(format);

        MessageBox.Show(result);            
    }
}

技術的には、長い形式の場合、その日の名前が間に挟まれていると機能しない可能性があります。そのためには、最長の完全一致ではなく、共通部分文字列が最長のパターンを選択する必要があります。

于 2009-09-08T18:50:39.910 に答える
11
String formattedDate = DateTime.Now.Date.ToLongDateString().Replace(DateTime.Now.DayOfWeek.ToString()+ ", ", "")
于 2013-05-31T19:21:05.407 に答える
4

これを達成するための非常にひどい、恐ろしい方法は、既存のLongDatePatternから不要なフォーマット指定子を削除することです。

public static string CorrectedLongDatePattern(CultureInfo cultureInfo)
{
    var info = cultureInfo.DateTimeFormat;

    // This is bad, mmmkay?
    return Regex.Replace(info.LongDatePattern, "dddd,?",String.Empty).Trim();
}
于 2009-09-08T18:43:44.170 に答える
4

これは Reza からの改善された回答であり、一部のローカリゼーションでは正しく機能しません。

string formattedDate = DateTime.Now.ToLongDateString()
   .Replace(DateTimeFormatInfo.CurrentInfo.GetDayName(DateTime.Now.DayOfWeek), "")
   .TrimStart(", ".ToCharArray());
于 2018-10-10T08:59:24.130 に答える
2

これは非常に古いスレッドですが、私が解決する必要のあるユースケースに完全に一致していたので、これに出会いました。最終的に機能するコードを作成したので、それを必要とする人のために含めようと思いました。(現在の日付をデフォルトにする、カルチャの完全な日付文字列を許可する、または曜日を削除したものを許可するなど、いくつかの追加のトリックがあります):

 public string DateString(DateTime? pDt = null, string lang, bool includeDayOfWeek = true)
 {
    if (pDt == null) pDt = DateTime.Now;
    DateTime dt = (DateTime)pDt;

    System.Globalization.CultureInfo culture = null; 
    try {   culture = new System.Globalization.CultureInfo(lang); } 
       catch{ culture = System.Globalization.CultureInfo.InvariantCulture; }

    string ss = dt.ToString("D", culture);
    if (!includeDayOfWeek)
    {
       //  Find day-of-week string, and remove it from the date string
       //  (including any trailing spaces or punctuation)
       string dow = dt.ToString("dddd", culture);
       int len = dow.Length;
       int pos = ss.IndexOf(dow);
       if (pos >= 0)
       {
          while ( ((len + pos) < ss.Length)  &&  ( !Char.IsLetterOrDigit(ss[len+pos])))
             len++;
          ss = ss.Substring(0, pos) + ss.Substring(len+pos, ss.Length - (len+pos));
       }
    }
   return ss;
 }
于 2015-11-30T06:20:29.240 に答える
2

LongDate シーケンスもカルチャに固有である場合は、残念ながら運が悪く、実際のコードを記述する必要があります。それ以外の場合は、書式タグのコレクションでうまくいきます。

残念ながら、あなたがしなければならないことは、ローカル カルチャで 7 つの文字列 (毎日 1 つ) の配列を作成し、それらの文字列を LongDate 形式の出力から削除することです。次に、重複した / と - とスペースをすべて削除してください。

もっと良い方法があることを願っていますが、私はそれを見ません。

于 2009-09-08T16:50:35.160 に答える
0

LongDate を取得して、曜日が表示される最初の部分を削除してみませんか?

DateTime date = Convert.ToDateTime(content["DisplayDate"]); 
  //-->3/15/2016 2:09:13 PM

string newDate = date.ToString("D", new CultureInfo("es-ES")); 
  //--> martes, 15 de marzo de 2016

var index = newDate.IndexOf(",") + 1;
  //--> 7

string finalDate = newDate.Substring(index);
  //--> 15 de marzo de 2016
于 2016-03-16T20:40:52.573 に答える
0

古い投稿ですが、私はこれを使用しています:

public static string ToLongDateWithoutWeekDayString(this DateTime source)
{
    return source.ToLongDateString()
                 .Replace(source.DayOfWeek.ToString(), "")
                 .Trim(',', ' ');
}
于 2016-03-21T07:18:12.180 に答える
-1

試す:

DateTime time = ....
string formmattedDate = time.Day.ToString() + " " + time.ToString("MMMM");
于 2009-09-08T16:48:50.313 に答える