Получение суффикса дня при использовании DateTime.Метод toString()
можно ли включить суффикс дня при форматировании даты с помощью DateTime.ToString ()?
например, я хотел бы напечатать дату в следующем формате - понедельник 27 июля 2009 года. Однако ближайший пример я могу найти с помощью DateTime.ToString () - понедельник 27 июля 2009 года.
могу ли я сделать это с DateTime.ToString () или мне придется вернуться к своему собственному коду?
15 ответов:
в качестве ссылки я всегда использую/refer to Форматирование Строки SteveX и там, кажется, нет никакого "th" в любой из доступных переменных, но вы можете легко построить строку с
string.Format("{0:dddd dd}{1} {0:MMMM yyyy}", DateTime.Now, (?));
тогда вам придется поставить " st "для 1," nd "для 2," rd "для 3 и" th "для всех остальных и может быть выровнен с"? :" заявление.
(DateTime.Now.Day % 10 == 1 && DateTime.Now.Day != 11) ? "st" : (DateTime.Now.Day % 10 == 2 && DateTime.Now.Day != 12) ? "nd" : (DateTime.Now.Day % 10 == 3 && DateTime.Now.Day != 13) ? "rd" : "th"
другой вариант с помощью переключателя:
string GetDaySuffix(int day) { switch (day) { case 1: case 21: case 31: return "st"; case 2: case 22: return "nd"; case 3: case 23: return "rd"; default: return "th"; } }
используя несколько методов расширения:
namespace System { public static class IntegerExtensions { public static string ToOccurrenceSuffix(this int integer) { switch (integer % 100) { case 11: case 12: case 13: return "th"; } switch (integer % 10) { case 1: return "st"; case 2: return "nd"; case 3: return "rd"; default: return "th"; } } } public static class DateTimeExtensions { public static string ToString(this DateTime dateTime, string format, bool useExtendedSpecifiers) { return dateTime.ToString(format) .Replace("nn", dateTime.Day.ToOccurrenceSuffix().ToLower()) .Replace("NN", dateTime.Day.ToOccurrenceSuffix().ToUpper()); } } }
использование:
return DateTime.Now.ToString("dddd, dnn MMMM yyyy", useExtendedSpecifiers: true); // Friday, 7th March 2014
Примечание: метод целочисленного расширения может быть использован для любого числа, а не только от 1 до 31. например,
return 332211.ToOccurrenceSuffix(); // th
другой вариант-это использовать Оператор По Модулю:
public string CreateDateSuffix(DateTime date) { // Get day... var day = date.Day; // Get day modulo... var dayModulo = day%10; // Convert day to string... var suffix = day.ToString(CultureInfo.InvariantCulture); // Combine day with correct suffix... suffix += (day == 11 || day == 12 || day == 13) ? "th" : (dayModulo == 1) ? "st" : (dayModulo == 2) ? "nd" : (dayModulo == 3) ? "rd" : "th"; // Return result... return suffix; }
вот Расширенная версия, включая 11-й, 12-й и 13-й:
DateTime dt = DateTime.Now; string d2d = dt.ToString("dd").Substring(1); string daySuffix = (dt.Day == 11 || dt.Day == 12 || dt.Day == 13) ? "th" : (d2d == "1") ? "st" : (d2d == "2") ? "nd" : (d2d == "3") ? "rd" : "th";
вот метод расширения (потому что все любят методы расширения), с ответом Лазлоу в качестве основы (выбрал Лазлоу, поскольку его легко читать).
работает так же, как обычный
ToString()
метод onDateTime
за исключением того, что если формат содержитd
илиdd
, то суффикс будет добавлен автоматически./// <summary> /// Return a DateTime string with suffix e.g. "st", "nd", "rd", "th" /// So a format "dd-MMM-yyyy" could return "16th-Jan-2014" /// </summary> public static string ToStringWithSuffix(this DateTime dateTime, string format, string suffixPlaceHolder = "$") { if(format.LastIndexOf("d", StringComparison.Ordinal) == -1 || format.Count(x => x == 'd') > 2) { return dateTime.ToString(format); } string suffix; switch(dateTime.Day) { case 1: case 21: case 31: suffix = "st"; break; case 2: case 22: suffix = "nd"; break; case 3: case 23: suffix = "rd"; break; default: suffix = "th"; break; } var formatWithSuffix = format.Insert(format.LastIndexOf("d", StringComparison.InvariantCultureIgnoreCase) + 1, suffixPlaceHolder); var date = dateTime.ToString(formatWithSuffix); return date.Replace(suffixPlaceHolder, suffix); }
принимая ответ @Lazlow на полное решение, Ниже приведен полностью многоразовый метод расширения с использованием примера;
internal static string HumanisedDate(this DateTime date) { string ordinal; switch (date.Day) { case 1: case 21: case 31: ordinal = "st"; break; case 2: case 22: ordinal = "nd"; break; case 3: case 23: ordinal = "rd"; break; default: ordinal = "th"; break; } return string.Format("{0:dddd dd}{1} {0:MMMM yyyy}", date, ordinal); }
чтобы использовать это, вы просто назовете его на
DateTime
объект;var myDate = DateTime.Now(); var myDateString = myDate.HumanisedFormat()
что даст вам:
пятница, 17 июня 2016 года
Я считаю, что это хорошее решение, охватывающее такие числа, как 111-й и т. д.:
private string daySuffix(int day) { if (day > 0) { if (day % 10 == 1 && day % 100 != 11) return "st"; else if (day % 10 == 2 && day % 100 != 12) return "nd"; else if (day % 10 == 3 && day % 100 != 13) return "rd"; else return "th"; } else return string.Empty; }
Я сделал это так, он обходит некоторые проблемы, приведенные в других примерах.
public static string TwoLetterSuffix(this DateTime @this) { var dayMod10 = @this.Day % 10; if (dayMod10 > 3 || dayMod10 == 0 || (@this.Day >= 10 && @this.Day <= 19)) { return "th"; } else if(dayMod10 == 1) { return "st"; } else if (dayMod10 == 2) { return "nd"; } else { return "rd"; } }
дешевое и веселое решение VB:
litDate.Text = DatePart("dd", Now) & GetDateSuffix(DatePart("dd", Now)) Function GetDateSuffix(ByVal dateIn As Integer) As String '// returns formatted date suffix Dim dateSuffix As String = "" Select Case dateIn Case 1, 21, 31 dateSuffix = "st" Case 2, 22 dateSuffix = "nd" Case 3, 23 dateSuffix = "rd" Case Else dateSuffix = "th" End Select Return dateSuffix End Function
для чего его стоит здесь мое окончательное решение, используя следующие ответы
DateTime dt = DateTime.Now; string d2d = dt.ToString("dd").Substring(1); string suffix = (dt.Day == 11 || dt.Day == 12 || dt.Day == 13) ? "th" : (d2d == "1") ? "st" : (d2d == "2") ? "nd" : (d2d == "3") ? "rd" : "th"; Date.Text = DateTime.Today.ToString("dddd d") + suffix + " " + DateTime.Today.ToString("MMMM") + DateTime.Today.ToString(" yyyy");
public static String SuffixDate(DateTime date) { порядковый номер строки;
switch (date.Day) { case 1: case 21: case 31: ordinal = "st"; break; case 2: case 22: ordinal = "nd"; break; case 3: case 23: ordinal = "rd"; break; default: ordinal = "th"; break; } if (date.Day < 10) return string.Format("{0:d}{2} {1:MMMM yyyy}", date.Day, date, ordinal); else return string.Format("{0:dd}{1} {0:MMMM yyyy}", date, ordinal); }
Получить Суффикс Даты. (Статическая Функция)
public static string GetSuffix(this string day) { string suffix = "th"; if (int.Parse(day) < 11 || int.Parse(day) > 20) { day = day.ToCharArray()[day.ToCharArray().Length - 1].ToString(); switch (day) { case "1": suffix = "st"; break; case "2": suffix = "nd"; break; case "3": suffix = "rd"; break; } } return suffix; }
в документации MSDN нет ссылки на язык и региональные параметры, которые могли бы преобразовать этот 17 в 17-й. так что вы должны сделать это вручную с помощью кода позади.Или построить его...вы можете создать функцию, которая делает это.
public string CustomToString(this DateTime date) { string dateAsString = string.empty; <here wright your code to convert 17 to 17th> return dateAsString; }
другой вариант, используя последнюю строку символов:
public static string getDayWithSuffix(int day) { string d = day.ToString(); if (day < 11 || day > 13) { if (d.EndsWith("1")) { d += "st"; } else if (d.EndsWith("2")) { d += "nd"; } else if (d.EndsWith("3")) { d += "rd"; } else { d += "th"; } else { d += "th"; } return d; }