Как получить формат 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
Ответы
Ответ 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");