Как мне создать формат даты, такой как «1 ноября» в c # - PullRequest
14 голосов
/ 28 декабря 2010

Как мне получить ниже упомянутый формат даты в c #.

  • Для 1 ноября 2010 он должен отображаться как: 1 ноября

  • Для 30 ноября 2010 он должен отображаться как: 30 ноября

Можем ли мы использовать любой формат даты или создать пользовательскую функцию, которая возвращает 1 -> 'st', 2-> 'nd' 3-> 'rd', любая дата нет -> 'th'.

Ответы [ 6 ]

32 голосов
/ 28 декабря 2010

Следующий код основан на том ответе , который генерирует порядковый номер из целого числа:

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);            
}
2 голосов
/ 28 декабря 2010

Итак, вот полное решение с методами расширения.Работает на 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();

Надежда, которая помогает.

1 голос
/ 28 декабря 2010

Что-то вроде этого должно работать ...

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;


     }
   }
}
0 голосов
/ 04 сентября 2015

Я последовал примеру блога с примером из JSL vscontrol, в конце которого обнаружена ошибка, он забыл объединить номер дня в начале строки, поэтому он должен быть

  return strNum + ordinal + str;

, а не!

  return ordinal + str;
0 голосов
/ 28 декабря 2010

Вы можете использовать Регулярные выражения для извлечения дня и месяца.Затем сохраните все имена месяцев в массиве и используйте .startsWith , чтобы получить правильное название месяца.Вы можете использовать простой case, чтобы узнать, нужны ли вам «st», «nd», «rd» или «th».

0 голосов
/ 28 декабря 2010

Я почти уверен, что нет никакой подпрограммы обработки данных, которая показала бы дату 1-го или 30-го.

Недавно я написал такой код с нуля.Я думаю, вам нужно сделать то же самое.

У меня нет удобного кода, но я просто создал массив строк с буквами для каждого числа ("th", "st", "nd", "й", "й" и т. д.).Затем мод против 10 и использовать остаток в качестве индекса в массиве.Вы можете просто добавить эту строку к своему номеру.

...