Подтвердить что ты не робот

Как получить формат Long Date из DateTime без буднего дня

Я ищу способ знакомства с языком, позволяющий получить длительное время без рабочего дня. Просто такой зверь существует?

Ниже приведен код, который я использую для получения формата длинных дат, включая день недели:

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

Edit

Примеры того, что я хотел бы видеть:

  • ru-us: 5 декабря 2009 г.
  • fr-fr: 5 décembre 2009
  • es: 05 de diciembre de 2009

ToLongDateString() возвращает следующее:

  • ru-us: Суббота, 5 декабря 2009 г.
  • fr-fr: samedi 5 décembre 2009
  • es-es: sábado, 05 de diciembre de 2009
4b9b3361

Ответ 1

Казалось, это трюк.

  • Перечислить все допустимые шаблоны datetime: CultureInfo.DateTimeFormat.GetAllDateTimePatterns
  • Выберите самый длинный шаблон (предположительно, это лучшее совпадение), который:
    • Подстрока объекта 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);            
    }
}

Технически, вероятно, это не сработало бы, если бы длинный формат имел название дня, зажатого посередине. Для этого я должен выбрать шаблон с самой длинной общей подстрокой, а не с самым длинным точным соответствием.

Ответ 2

String formattedDate = DateTime.Now.Date.ToLongDateString().Replace(DateTime.Now.DayOfWeek.ToString()+ ", ", "")

Ответ 3

Очень ужасный, ужасный способ добиться этого - удалить спецификаторы формата, которые вы не хотите из существующего LongDatePattern:

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

    // This is bad, mmmkay?
    return Regex.Replace(info.LongDatePattern, "dddd,?",String.Empty).Trim();
}

Ответ 4

Если последовательность LongDate также специфична для культуры, я боюсь, что вам не повезло, и вам нужно будет написать для этого фактический код. В противном случае коллекция тэгов делает трюк.

Я боюсь, что вам нужно будет создать массив из 7 строк (по одному на каждый день) в локальной культуре и удалить эти строки из вывода формата LongDate. Затем убедитесь, что вы удалите все дублированные /- и пробелы.

Надеюсь, что лучше, но я этого не вижу.

Ответ 5

Это старый старый апад, но я наткнулся на него, потому что он идеально соответствовал используемому делу, который мне нужно было решить. Я закончил тем, что написал кусок кода, который работает, поэтому я подумал, что я включу его для тех, кому это нужно. (У него есть несколько дополнительных трюков, например, по умолчанию на текущую дату, и позволяет либо полную строку даты для культуры, либо одну с удаленным днём):

 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;
 }

Ответ 6

Я расширил предложение Bart Calixto по исправлению проблемы формата dd MMM yyyy (здесь, в Австралии, мы также используем формат даты в формате dd/mm/yy)

Мне также часто нужно конвертировать между форматами даты в Австралии и США.

Этот код исправляет проблему (моя версия находится в VB)

Public Shared Function ToLongDateWithoutWeekDayString(source As DateTime, cult As System.Globalization.CultureInfo) As String

Return source.ToString("D", cult).Replace(source.DayOfWeek.ToString(), "").Trim(","c, " "c)

End Function

Перед вызовом функции вам нужно установить культуру, я делаю это так, чтобы получить страну-посетителя из http://ipinfo.io

Select Case Country.country
            Case "AU"
                cult = New CultureInfo("en-AU")
            Case "US"
                cult = New CultureInfo("en-US")
            Case "GB"
                cult = New CultureInfo("en-GB")
        End Select

Dim date1 As New Date(2010, 8, 18)
lblDate.Text = ToLongDateWithoutWeekDayString(date1, cult)

После настройки результата настройки AU или GB 18 августа 2010 г.

После настройки результата культуры США - 18 августа 2010 г.

Адам, согласны ли вы с этим, решает проблему форматирования, на которую вы ссылаетесь?

Спасибо Барту, что был очень хороший код.

Не забудьте добавить Dim cult As System.Globalization.CultureInfo после Наследует System.Web.UI.Page

Ответ 7

Try:

DateTime time = ....
string formmattedDate = time.Day.ToString() + " " + time.ToString("MMMM");

Ответ 8

Почему бы не получить 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

Ответ 9

Старый пост, но я использую это:

public static string ToLongDateWithoutWeekDayString(this DateTime source)
{
    return source.ToLongDateString()
                 .Replace(source.DayOfWeek.ToString(), "")
                 .Trim(',', ' ');
}

Ответ 10

Что случилось с:

var ci = CultureInfo.CreateSpecificCulture("nl-NL");
var date1 = DateTime.ParseExact(date, "dd MMM yyyy", ci);

Ответ 11

Просто укажите формат:

DateTime.ToString("MMMM dd, yyyy");