我如何在 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
How can i format 07/03/2012 to March 7th,2012 in c#
提问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#?
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()

