使用DateTime.ToString()格式化日期时是否可以包含日期的后缀呢?
例如,我希望按照以下格式打印日期 - 2009年7月27日星期一。但是,使用DateTime.ToString()找到的最接近的例子是:Monday 27 July 2009。
我能否使用DateTime.ToString()实现这一点,还是必须要使用自己的代码来完成?
使用DateTime.ToString()格式化日期时是否可以包含日期的后缀呢?
例如,我希望按照以下格式打印日期 - 2009年7月27日星期一。但是,使用DateTime.ToString()找到的最接近的例子是:Monday 27 July 2009。
我能否使用DateTime.ToString()实现这一点,还是必须要使用自己的代码来完成?
使用 switch 的另一个选项:
string GetDaySuffix(int day)
{
switch (day)
{
case 1:
case 21:
case 31:
return "st";
case 2:
case 22:
return "nd";
case 3:
case 23:
return "rd";
default:
return "th";
}
}
作为参考,我总是使用/参考 [SteveX字符串格式化]1,似乎没有任何可用变量中包含“th”,但你可以轻松地构建一个带有这个字符串的字符串。
string.Format("{0:dddd dd}{1} {0:MMMM yyyy}", DateTime.Now, (?));
然后你需要为1提供"st",为2提供"nd",为3提供"rd",并且对于所有其他情况都需要提供"th",可以使用"? :" 语句进行内联。
var now = DateTime.Now;
(now.Day % 10 == 1 && now.Day % 100 != 11) ? "st"
: (now.Day % 10 == 2 && now.Day % 100 != 12) ? "nd"
: (now.Day % 10 == 3 && now.Day % 100 != 13) ? "rd"
: "th"
DateTime.Now
,当代码在午夜左右执行时,这些值可能会不同。 - AlexD112th
而不是112nd
。 - Jez使用几个扩展方法:
namespace System
{
public static class IntegerExtensions
{
public static string ToOccurrenceSuffix(this int integer)
{
switch (integer % 100)
{
case 11:
case 12:
case 13:
return "th";
}
switch (integer % 10)
{
case 1:
return "st";
case 2:
return "nd";
case 3:
return "rd";
default:
return "th";
}
}
}
public static class DateTimeExtensions
{
public static string ToString(this DateTime dateTime, string format, bool useExtendedSpecifiers)
{
return useExtendedSpecifiers
? dateTime.ToString(format)
.Replace("nn", dateTime.Day.ToOccurrenceSuffix().ToLower())
.Replace("NN", dateTime.Day.ToOccurrenceSuffix().ToUpper())
: dateTime.ToString(format);
}
}
}
使用方法:
return DateTime.Now.ToString("dddd, dnn MMMM yyyy", useExtendedSpecifiers: true);
// Friday, 7th March 2014
注意:整数扩展方法可用于任何数字,而不仅限于1到31。例如:
return 332211.ToOccurrenceSuffix();
// th
useExtendedSpecifiers
布尔值 :p - Nyerguds另一个选择是使用模数运算符:
public string CreateDateSuffix(DateTime date)
{
// Get day...
var day = date.Day;
// Get day modulo...
var dayModulo = day%10;
// Convert day to string...
var suffix = day.ToString(CultureInfo.InvariantCulture);
// Combine day with correct suffix...
suffix += (day == 11 || day == 12 || day == 13) ? "th" :
(dayModulo == 1) ? "st" :
(dayModulo == 2) ? "nd" :
(dayModulo == 3) ? "rd" :
"th";
// Return result...
return suffix;
}
你可以通过将一个DateTime对象作为参数传递来调用上述方法,例如:// Get date suffix for 'October 8th, 2019':
var suffix = CreateDateSuffix(new DateTime(2019, 10, 8));
有关 DateTime 构造函数的更多信息,请参阅 Microsoft 文档页面。
var suffix = CreateDateSuffix(new DateTime(2013, 10, 8));
返回的是“第8天”? - Anthony Walsh参考@Lazlow的回答,以下是完整可重用的扩展方法及其使用示例:
internal static string HumanisedDate(this DateTime date)
{
string ordinal;
switch (date.Day)
{
case 1:
case 21:
case 31:
ordinal = "st";
break;
case 2:
case 22:
ordinal = "nd";
break;
case 3:
case 23:
ordinal = "rd";
break;
default:
ordinal = "th";
break;
}
return string.Format("{0:dddd dd}{1} {0:MMMM yyyy}", date, ordinal);
}
DateTime
对象上调用它即可;var myDate = DateTime.Now();
var myDateString = myDate.HumanisedFormat()
2016年6月17日,星期五
这里是包括第11、12和13版的扩展版本:
DateTime dt = DateTime.Now;
string d2d = dt.ToString("dd").Substring(1);
string daySuffix =
(dt.Day == 11 || dt.Day == 12 || dt.Day == 13) ? "th"
: (d2d == "1") ? "st"
: (d2d == "2") ? "nd"
: (d2d == "3") ? "rd"
: "th";
("dd")
更大的数字,请使用 string.PadLeft()
。 - maxp更新
NuGet包:
https://www.nuget.org/packages/DateTimeToStringWithSuffix
示例:
https://dotnetfiddle.net/zXQX7y
支持:
.NET Core 1.0及以上版本
.NET Framework 4.5及以上版本
这是一个扩展方法(因为每个人都喜欢扩展方法),以Lazlow的答案为基础(选择Lazlow的方法因其易于阅读)。
与DateTime
的常规ToString()
方法相同,唯一的区别在于如果格式包含d
或dd
,则会自动添加后缀。
/// <summary>
/// Return a DateTime string with suffix e.g. "st", "nd", "rd", "th"
/// So a format "dd-MMM-yyyy" could return "16th-Jan-2014"
/// </summary>
public static string ToStringWithSuffix(this DateTime dateTime, string format, string suffixPlaceHolder = "$") {
if(format.LastIndexOf("d", StringComparison.Ordinal) == -1 || format.Count(x => x == 'd') > 2) {
return dateTime.ToString(format);
}
string suffix;
switch(dateTime.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;
}
var formatWithSuffix = format.Insert(format.LastIndexOf("d", StringComparison.InvariantCultureIgnoreCase) + 1, suffixPlaceHolder);
var date = dateTime.ToString(formatWithSuffix);
return date.Replace(suffixPlaceHolder, suffix);
}
Console.WriteLine(DateTime.UtcNow.ToString("dddd")+" "+DateTime.UtcNow.ToStringWithSuffix("d MMMM yyyy"));
。 - JohnC# 8引入了更简单的解决方案,使用switch表达式:
var daySuffix = dateTime.Day switch {
1 or 21 or 31 => "st",
2 or 22 => "nd",
3 or 23 => "rd",
_ => "th",
};
我认为这是一个不错的解决方案,可以涵盖像111th等数字:
private string daySuffix(int day)
{
if (day > 0)
{
if (day % 10 == 1 && day % 100 != 11)
return "st";
else if (day % 10 == 2 && day % 100 != 12)
return "nd";
else if (day % 10 == 3 && day % 100 != 13)
return "rd";
else
return "th";
}
else
return string.Empty;
}
对于那些乐于使用外部依赖(在这种情况下是极好的Humanizr.net),这很简单。
dateVar.Day.Ordinalize(); \\ 根据dateVar的值,可以得到1st、4th等结果。