我如何在 C# 中将 07/03/2012 格式化到 2012 年 3 月 7 日

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9601593/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-09 08:04:01  来源:igfitidea点击:

How can i format 07/03/2012 to March 7th,2012 in c#

c#datetimeformatting

提问by Sreenath Plakkat

Any one please help i need to show the date 03/03/2012 as March 3rd,2012 etc

任何人请帮助我需要将日期 03/03/2012 显示为 2012 年 3 月 3 日等

采纳答案by Rob Levine

You can create your own custom format provider to do this:

您可以创建自己的自定义格式提供程序来执行此操作:

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);
    }
}

This can then be called like this:

然后可以这样调用:

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

Resulting in (for example):

导致(例如):

March 3rd, 2012

2012 年 3 月 3 日

回答by CD..

Custom Date and Time Format Strings

自定义日期和时间格式字符串

date.ToString("MMMM d, yyyy")

Or if you need the "rd" too:

或者,如果您也需要“rd”:

string.Format("{0} {1}, {2}", date.ToString("MMMM"), date.Day.Ordinal(), date.ToString("yyyy"))
  • the Ordinal()method can be found here
  • Ordinal()方法可以在这里找到

回答by ankit rajput

Use following Code:

使用以下代码:

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

回答by ankit rajput

DateTime dt = new DateTime(args);
String.Format("{0:ddd, MMM d, yyyy}", dt); 

// "Sun, Mar 9, 2008"

//“2008 年 3 月 9 日星期日”

回答by Anders Forsgren

No, there is nothing in string.Format() that will give you ordinals (1st, 2nd, 3rd, 4th and so on).

不,string.Format() 中没有任何内容可以为您提供序数(第 1、第 2、第 3、第 4 等)。

You can combine the date format like suggested in other answers, with your own ordinal as suggested for example in this answer

您可以将其他答案中建议的日期格式与您自己的序号相结合,例如本答案中的建议

Is there an easy way to create ordinals in C#?

有没有一种简单的方法可以在 C# 中创建序数?

string Format(DateTime date)
{
    int dayNo = date.Day;
    return string.Format("{0} {1}{2}, {3}", 
                date.ToString("MMMM"), dayNo, AddOrdinal(dayNo), date.Year); 
}

回答by AaronHS

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;
    }
}

Proof:

证明:

[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());
    }
}

回答by regisbsb

Humanizermeets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities

Humanizer满足您对操作和显示字符串、枚举、日期、时间、时间跨度、数字和数量的所有 .NET 需求

To install Humanizer, run the following command in the Package Manager Console

要安装 Humanizer,请在包管理器控制台中运行以下命令

PM> Install-Package Humanizer

Ordinalize turns a number into an ordinal string used to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th:

Ordinalize 将一个数字变成一个序数字符串,用于表示有序序列中的位置,例如 1st、2nd、3rd、4th:

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

Then you can use:

然后你可以使用:

String.Format("{0} {1:MMMM yyyy}", date.Day.Ordinalize(), date)

回答by dprothero

Based on Rob Levine's answer and the comments on that answer... I've adapted as an extension method on DateTime so you can just call:

基于 Rob Levine 的回答和对该答案的评论......我已经适应了 DateTime 的扩展方法,所以你可以调用:

var formattedDate = date.Friendly();

Here's the extension method:

这是扩展方法:

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);
  }
}

回答by Amine Boulaajaj

Here is another version of the Ordinalize() extension, short and sweet:

这是 Ordinalize() 扩展的另一个版本,简短而甜蜜:

public static string Ordinalize(this int x)
{
    var xString = x.ToString();
    var xLength = xString.Length;
    var xLastTwoCharacters = xString.Substring(Math.Max(0, xLength - 2));
    return xString + 
        ((x % 10 == 1 && xLastTwoCharacters != "11") 
            ? "st"
        : (x % 10 == 2 && xLastTwoCharacters != "12") 
            ? "nd"
        : (x % 10 == 3 && xLastTwoCharacters != "13") 
            ? "rd"
        : "th");
    }

and then call that extension like this

然后像这样调用该扩展

myDate.Day.Ordinalize()

or

或者

myAnyNumber.Ordinalize()