Как я могу отформатировать 07/03/2012 по 7 марта 2012 года в c # - PullRequest
29 голосов
/ 07 марта 2012

Любой, пожалуйста, помогите мне, чтобы показать дату 03.03.2012 как 3 марта 2012 года и т. Д.

Ответы [ 9 ]

47 голосов
/ 07 марта 2012

Вы можете создать свой собственный провайдер нестандартного формата, чтобы сделать это:

public class MyCustomDateProvider: IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof(ICustomFormatter))
            return this;

        return null;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (!(arg is DateTime)) throw new NotSupportedException();

        var dt = (DateTime) arg;

        string suffix;

        if (new[] {11, 12, 13}.Contains(dt.Day))
        {
            suffix = "th";
        }
        else if (dt.Day % 10 == 1)
        {
            suffix = "st";
        }
        else if (dt.Day % 10 == 2)
        {
            suffix = "nd";
        }
        else if (dt.Day % 10 == 3)
        {
            suffix = "rd";
        }
        else
        {
            suffix = "th";
        }

        return string.Format("{0:MMMM} {1}{2}, {0:yyyy}", arg, dt.Day, suffix);
    }
}

Это можно затем назвать так:

var formattedDate = string.Format(new MyCustomDateProvider(), "{0}", date);

В результате (например):

3 марта 2012 г.

29 голосов
/ 27 мая 2014

Humanizer соответствует всем вашим потребностям .NET для управления и отображения строк, перечислений, дат, времени, временных интервалов, чисел и количеств

Чтобы установить Humanizer, выполните следующую команду в пакетеДиспетчерская консоль

PM> Install-Package Humanizer

Ordinalize превращает число в порядковую строку, используемую для обозначения позиции в упорядоченной последовательности, например 1-й, 2-й, 3-й, 4-й:

1.Ordinalize() => "1st"
5.Ordinalize() => "5th"

Тогда вы можетеиспользовать:

String.Format("{0} {1:MMMM yyyy}", date.Day.Ordinalize(), date)
10 голосов
/ 07 марта 2012

Пользовательские строки формата даты и времени

date.ToString("MMMM d, yyyy")

Или, если вам нужен также "rd":

string.Format("{0} {1}, {2}", date.ToString("MMMM"), date.Day.Ordinal(), date.ToString("yyyy"))
3 голосов
/ 04 марта 2014
public static class IntegerExtensions
{
    /// <summary>
    /// converts an integer to its ordinal representation
    /// </summary>
    public static String AsOrdinal(this Int32 number)
    {
        if (number < 0)
            throw new ArgumentOutOfRangeException("number");

        var work = number.ToString("n0");

        var modOf100 = number % 100;

        if (modOf100 == 11 || modOf100 == 12 || modOf100 == 13)
            return work + "th";

        switch (number % 10)
        {
            case 1:
                work += "st"; break;
            case 2:
                work += "nd"; break;
            case 3:
                work += "rd"; break;
           default:
                work += "th"; break;
        }

        return work;
    }
}

Доказательство:

[TestFixture]
class IntegerExtensionTests
{
    [Test]
    public void TestCases_1s_10s_100s_1000s()
    {
        Assert.AreEqual("1st", 1.AsOrdinal());
        Assert.AreEqual("2nd", 2.AsOrdinal());
        Assert.AreEqual("3rd", 3.AsOrdinal());

        foreach (var integer in Enumerable.Range(4, 6))
            Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());

        Assert.AreEqual("11th", 11.AsOrdinal());
        Assert.AreEqual("12th", 12.AsOrdinal());
        Assert.AreEqual("13th", 13.AsOrdinal());

        foreach (var integer in Enumerable.Range(14, 6))
            Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());

        Assert.AreEqual("21st", 21.AsOrdinal());
        Assert.AreEqual("22nd", 22.AsOrdinal());
        Assert.AreEqual("23rd", 23.AsOrdinal());

        foreach (var integer in Enumerable.Range(24, 6))
            Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());

        Assert.AreEqual("31st", 31.AsOrdinal());
        Assert.AreEqual("32nd", 32.AsOrdinal());
        Assert.AreEqual("33rd", 33.AsOrdinal());

        //then just jump to 100

        Assert.AreEqual("101st", 101.AsOrdinal());
        Assert.AreEqual("102nd", 102.AsOrdinal());
        Assert.AreEqual("103rd", 103.AsOrdinal());

        foreach (var integer in Enumerable.Range(104, 6))
            Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());

        Assert.AreEqual("111th", 111.AsOrdinal());
        Assert.AreEqual("112th", 112.AsOrdinal());
        Assert.AreEqual("113th", 113.AsOrdinal());

        foreach (var integer in Enumerable.Range(114, 6))
            Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());

        Assert.AreEqual("121st", 121.AsOrdinal());
        Assert.AreEqual("122nd", 122.AsOrdinal());
        Assert.AreEqual("123rd", 123.AsOrdinal());

        foreach (var integer in Enumerable.Range(124, 6))
            Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());

        //then just jump to 1000

        Assert.AreEqual("1,001st", 1001.AsOrdinal());
        Assert.AreEqual("1,002nd", 1002.AsOrdinal());
        Assert.AreEqual("1,003rd", 1003.AsOrdinal());

        foreach (var integer in Enumerable.Range(1004, 6))
            Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());

        Assert.AreEqual("1,011th", 1011.AsOrdinal());
        Assert.AreEqual("1,012th", 1012.AsOrdinal());
        Assert.AreEqual("1,013th", 1013.AsOrdinal());

        foreach (var integer in Enumerable.Range(1014, 6))
            Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());

        Assert.AreEqual("1,021st", 1021.AsOrdinal());
        Assert.AreEqual("1,022nd", 1022.AsOrdinal());
        Assert.AreEqual("1,023rd", 1023.AsOrdinal());

        foreach (var integer in Enumerable.Range(1024, 6))
            Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());
    }
}
3 голосов
/ 07 марта 2012

Нет, в строке нет ничего. Формат (), который даст вам порядковые номера (1-й, 2-й, 3-й, 4-й и т. Д.).

Вы можете комбинировать формат даты, как предложено в других ответахс вашим собственным порядковым номером, как предлагается, например, в этом ответе

Существует ли простой способ создания ординалов в C #?

string Format(DateTime date)
{
    int dayNo = date.Day;
    return string.Format("{0} {1}{2}, {3}", 
                date.ToString("MMMM"), dayNo, AddOrdinal(dayNo), date.Year); 
}
2 голосов
/ 26 февраля 2015

Основываясь на ответе Роба Левина и комментариях к этому ответу ... Я адаптировал метод DateTime в качестве расширения, поэтому вы можете просто позвонить:

var formattedDate = date.Friendly();

Вот метод расширения:

public static class DateFormatter
{
  public static string Friendly(this DateTime dt)
  {
    string suffix;

    switch (dt.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;
    }

    return string.Format("{0:MMMM} {1}{2}, {0:yyyy}", dt, dt.Day, suffix);
  }
}
0 голосов
/ 23 января 2018

Вот еще одна версия расширения Ordinalize (), short и sweet:

public static string Ordinalize(this int x)
{
    return x.ToString() + 
        ((x % 10 == 1 && x != 11) 
        ? "st"
        : (x % 10 == 2 && x != 12) 
        ? "nd"
        : (x % 10 == 3 && x != 13) 
        ? "rd"
        : "th");
}

, а затем назовите это расширение следующим образом:

myDate.Day.Ordinalize()

или

myAnyNumber.Ordinalize() 
0 голосов
/ 07 марта 2012
DateTime dt = new DateTime(args);
String.Format("{0:ddd, MMM d, yyyy}", dt); 

// "Солнце, 9 марта 2008 г."

0 голосов
/ 07 марта 2012

Используйте следующий код:

DateTime thisDate1 = new DateTime(2011, 6, 10);
Console.WriteLine("Today is " + thisDate1.ToString("MMMM dd, yyyy") + ".");

DateTimeOffset thisDate2 = new DateTimeOffset(2011, 6, 10, 15, 24, 16, 
                                              TimeSpan.Zero);
Console.WriteLine("The current date and time: {0:MM/dd/yy H:mm:ss zzz}", 
                   thisDate2); 
// The example displays the following output:
//    Today is June 10, 2011.
//    The current date and time: 06/10/11 15:24:16 +00:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...