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

StackOverflow https://stackoverflow.com/questions/1395022

Вопрос

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

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

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

Редактировать

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

  • ru-мы:5 декабря 2009 года
  • фр-фр:5 décembre 2009
  • эс-эс:05 de diciembre de 2009

Функция ToLongDateString() возвращает следующее:

  • ru-мы:Суббота, 5 декабря 2009 г.
  • фр-фр:samedi 5 décembre 2009
  • эс-эс:sábado, 05 de diciembre de 2009
Это было полезно?

Решение

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

  1. Перечислите все допустимые шаблоны даты и времени:CultureInfo.Формат даты и времени.Получить все шаблоны даты и времени
  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);            
    }
}

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

Другие советы

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

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

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

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

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

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

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

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

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

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

Мне также часто приходится конвертировать между форматами даты Aust и US.

Этот код устраняет проблему (моя версия находится в 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 г.

После установки US culture результат - 18 августа 2010 года

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

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

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

Это улучшенный ответ от Reza, который некорректно работает с некоторыми локализациями.

string formattedDate = DateTime.Now.ToLongDateString().Replace(System.Globalization.DateTimeFormatInfo.CurrentInfo.GetDayName(DateTime.Now.DayOfWeek), "").TrimStart(", ".ToCharArray());

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

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

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

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

Мое решение:

DateTime date = DateTime.Now;
CultureInfo culture = CultureInfo.CurrentCulture;
string dayName = date.ToString("dddd", culture);
string fullDate = date.ToString("f", culture);
string trim = string.Join(" ", fullDate.Replace(dayName, "").TrimStart(',').TrimStart(' ').Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); 

Последняя строка:

  1. Удаляет оставшуюся запятую в начале
  2. Удаляет оставшееся пространство при запуске
  3. Удаляет оставшийся двойной пробел из любого места строки

Протестировано для каждой культуры из

CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);

Улучшение принятого ответа, GetAllDateTimePatterns может принимать параметр, ограничивающий результат шаблонами, относящимися к строке стандартного формата, такими как 'D' для шаблона длинной даты.

Например, GetAllDateTimePatterns('D') в настоящее время возвращает это для en-US:

"dddd, MMMM d, yyyy", "MMMM d, yyyy", "dddd, d MMMM, yyyy", "d MMMM, yyyy" 

и это для ж-ХК:

"yyyy'年'M'月'd'日'", "yyyy'年'MM'月'dd'日'", "yyyy年MMMd日", "yyyy年MMMd日, dddd"

Предполагая, что они перечислены в некотором порядке предпочтения или распространенности, мы можем выбрать первый вариант, который не содержит день недели.

Вот методы расширения, чтобы вы могли просто использовать myDateTime.ToLongDateStringWithoutDayOfWeek() и myDateTime.ToLongDateTimeStringWithoutDayOfWeek().

public static string ToLongDateStringWithoutDayOfWeek(this DateTime d)
{
    return d.ToString(
               CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns('D')
                   .FirstOrDefault(a => !a.Contains("ddd") && !a.Contains("dddd")) 
               ?? "D");
}

public static string ToLongDateTimeStringWithoutDayOfWeek(this DateTime d, bool includeSeconds = false)
{
    char format = includeSeconds ? 'F' : 'f';
    return d.ToString(
               CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns(format)
                   .FirstOrDefault(a => !a.Contains("ddd") && !a.Contains("dddd")) 
               ?? format.ToString()); 
}

Попробуй:

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

Что плохого в:

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

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

DateTime.ToString("MMMM dd, yyyy");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top