Как создать формат даты, например "1 ноября" в c#
Как я могу сделать ниже упоминает формат даты в C#.
для 1-ноя-2010 он должен быть отображен как: 1-ое ноября
для 30-Nov-2010 он должен быть отображен как: 30th November
можем ли мы использовать любой формат даты или сделать пользовательскую функцию, которая возвращает 1 -> 'st', 2-> 'nd' 3-> 'rd', любую дату нет -> 'th'.
6 ответов
следующий код основан на том, что ответ который генерирует порядковый номер из целого числа:
public static string ToOrdinal(int number)
{
switch(number % 100)
{
case 11:
case 12:
case 13:
return number.ToString() + "th";
}
switch(number % 10)
{
case 1:
return number.ToString() + "st";
case 2:
return number.ToString() + "nd";
case 3:
return number.ToString() + "rd";
default:
return number.ToString() + "th";
}
}
чем вы можете создать свою выходную строку:
public static string GenerateDateString(DateTime value)
{
return string.Format(
"{0} {1:MMMM}",
ToOrdinal(value.Day),
value);
}
Итак, вот полное решение с методами расширения. Работает на C# 3.0 и выше. В основном плагиат Никхил это работы:
public static class DateTimeExtensions
{
static string[] extensions = // 0 1 2 3 4 5 6 7 8 9
{ "th", "st", "nd", "rd", "th", "th", "th", "tn", "th", "th",
// 10 11 12 13 14 15 16 17 18 19
"th", "th", "th", "th", "th", "th", "th", "tn", "th", "th",
// 20 21 22 23 24 25 26 27 28 29
"th", "st", "nd", "rd", "th", "th", "th", "tn", "th", "th",
// 30 31
"th", "st"
};
public static string ToSpecialString(this DateTime dt)
{
string s = dt.ToString(" MMMM yyyy");
string t = string.Format("{0}{1}", dt.Day, extensions[dt.Day]);
return t + s;
}
}
тест / использовать следующим образом:
Console.WriteLine(DateTime.Now.ToSpecialString());
Console.WriteLine(new DateTime(1990, 11, 12).ToSpecialString());
Console.WriteLine(new DateTime(1990, 1, 1).ToSpecialString());
Console.WriteLine(new DateTime(1990, 1, 2).ToSpecialString());
Console.WriteLine(new DateTime(1990, 1, 3).ToSpecialString());
Console.WriteLine(new DateTime(1990, 1, 4).ToSpecialString());
Console.WriteLine(new DateTime(1990, 12, 15).ToSpecialString());
Console.WriteLine(new DateTime(1990, 8, 19).ToSpecialString());
Console.WriteLine(new DateTime(1990, 9, 22).ToSpecialString());
Console.ReadKey();
надеюсь, что это поможет.
что-то вроде этого должно работать...
using System;
using System.Text;
namespace Program {
class Demo {
static string[] extensions =
// 0 1 2 3 4 5 6 7 8 9
{ "th", "st", "nd", "rd", "th", "th", "th", "tn", "th", "th",
// 10 11 12 13 14 15 16 17 18 19
"th", "th", "th", "th", "th", "th", "th", "tn", "th", "th",
// 20 21 22 23 24 25 26 27 28 29
"th", "st", "nd", "rd", "th", "th", "th", "tn", "th", "th",
// 30 31
"th", "st" };
public static void Main() {
String strTestDate = "02-11-2007";
DateTime coverdate = DateTime.ParseExact(strTestDate, "dd-MM-yyyy", null);
string s = coverdate.ToString(" MMMM yyyy");
string t = string.Format("{0}{1}",coverdate.Day,extensions[coverdate.Day]);
string result = t + s;
}
}
}
Я уверен, что нет процедуры datatime, чтобы показать дату как 1-й или 30-й.
недавно я написал такой код с нуля. Думаю, тебе нужно сделать то же самое.
У меня нет моего кода, но я просто создал массив строк с буквами для каждого числа ("th", "st", "nd", "rd", "th" и т. д.). Затем mod против 10 и используйте остаток в качестве индекса в массив. Вы можете просто добавить эту строку в ваш номер.
можно использовать Регулярные Выражения извлечь день и месяц. Затем сохраните все имена месяцев в массиве и используйте .как startswith чтобы получить собственное имя месяца. Вы можете использовать простой case
чтобы узнать, нужны ли вам "st", "nd", " rd " или "th".
Я следил за строковым примером блога из JSL vscontrol, и у него есть ошибка в конце, он забыл объединить номер дня в начале строки, поэтому он должен быть
return strNum + ordinal + str;
и нет !
return ordinal + str;