在使用DateTime.ToString()时如何获取日期后缀

102

使用DateTime.ToString()格式化日期时是否可以包含日期的后缀呢?

例如,我希望按照以下格式打印日期 - 2009年7月27日星期一。但是,使用DateTime.ToString()找到的最接近的例子是:Monday 27 July 2009。

我能否使用DateTime.ToString()实现这一点,还是必须要使用自己的代码来完成?


8
有人提到了NodaTime吗? - grenade
3
了解,"[日期]序数后缀"是这些称呼的标准。 "Day" 通常指周一至周日。 - Richard Szalay
@grenade 我非常希望这能成为答案。我已经花了近一个小时来按照问题中提到的方式格式化NodaTime,但据我所知它不起作用:https://nodatime.org/2.3.x/userguide/localdate-patterns(即使在2020年)。看起来momentjs有这个功能,因为它们建立了自己的本地化模型:https://momentjs.com/docs/#/i18n/ - Drew Delano
此外,我们所有的文本本地化资源(日期和月份名称)都来自.NET框架本身。这有一些显著的限制,并使Noda Time更加依赖CultureInfo,这并不理想。CLDR包含更多信息,应该允许功能,如序数日号(“1st”,“2nd”,“3rd”)和更广泛的支持的日历/文化组合(例如希伯来日历月份的英文名称)。 - Drew Delano
20个回答

1

公共静态字符串 SuffixDate(DateTime date) { 字符串序数;

     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;
     }
     if (date.Day < 10)
        return string.Format("{0:d}{2} {1:MMMM yyyy}", date.Day, date, ordinal);
     else
        return string.Format("{0:dd}{1} {0:MMMM yyyy}", date, ordinal);
  }

1
这个版本只显示一天的第一个数字,比如2017年3月1日,我不想先显示星期几,也不想显示01st而是1st。 - Robert Peter Bronstein

0

0
一个你可以在 Razor 模板中使用的解决方案。它可能不是最优雅的方式,但它快速并且有效。
@Model.Pubdate.ToString("dddd, d'th' MMMM yyyy").Replace("1th","1st").Replace("2th", "2nd").Replace("3th", "3rd").Replace("11st", "11th").Replace("12nd", "12th").Replace("13rd", "13th")

ToString("dddd, d'th' MMMM yyyy")会在日期后面添加“th”,例如“Tuesday, 31th May 2022”。然后使用一组字符串替换将1th、2th和3th更改为1st、2nd和3rd,并使用另一组字符串替换将11st、12nd和13rd更改回11th、12th和13th。


0

就算价值不大,这是我最终的解决方案,使用以下答案:

     DateTime dt = DateTime.Now;
        string d2d = dt.ToString("dd").Substring(1); 

        string suffix =
       (dt.Day == 11 || dt.Day == 12 || dt.Day == 13) ? "th"
       : (d2d == "1") ? "st"
       : (d2d == "2") ? "nd"
       : (d2d == "3") ? "rd"
       : "th";


        Date.Text = DateTime.Today.ToString("dddd d") + suffix + " " + DateTime.Today.ToString("MMMM") + DateTime.Today.ToString(" yyyy"); 

0

看看 Humanizr: https://github.com/Humanizr/Humanizer#date-time-to-ordinal-words

new DateTime(2015, 1, 1).ToOrdinalWords() => "1st January 2015"
new DateTime(2015, 2, 12).ToOrdinalWords() => "12th February 2015"
new DateTime(2015, 3, 22).ToOrdinalWords() => "22nd March 2015"
// for English US locale
new DateTime(2015, 1, 1).ToOrdinalWords() => "January 1st, 2015"
new DateTime(2015, 2, 12).ToOrdinalWords() => "February 12th, 2015"
new DateTime(2015, 3, 22).ToOrdinalWords() => "March 22nd, 2015"

我发帖后意识到 @Gumzle 建议了同样的事情,但是因为它被深埋在代码片段中,所以我错过了他的帖子。因此,这是他的答案,并附有足够的代码,让像我这样快速滚动浏览的人能够看到它。

-1
string datestring;    
// datestring = DateTime.Now.ToString("dd MMMM yyyy"); // 16 January 2021

    // code to add 'st' ,'nd', 'rd' and 'th' with day of month 
    // DateTime todaysDate = DateTime.Now.Date; // enable this line for current date 
    DateTime todaysDate = DateTime.Parse("01-13-2021"); // custom date to verify code // 13th January 2021
    int day = todaysDate.Day;
    string dateSuffix;

    if(day==1 || day==21 || day==31){
        dateSuffix= "st";
    }else if(day==2 || day==22 ){
        dateSuffix= "nd";
    }else if(day==3 || day==23 ){
        dateSuffix= "rd";
    }else{
        dateSuffix= "th";
    }
    datestring= day+dateSuffix+" "+todaysDate.ToString("MMMM")+" "+todaysDate.ToString("yyyy");
    Console.WriteLine(datestring);

-1
我是这样做的,它可以解决其他示例中出现的一些问题。
    public static string TwoLetterSuffix(this DateTime @this)
    {
        var dayMod10 = @this.Day % 10;

        if (dayMod10 > 3 || dayMod10 == 0 || (@this.Day >= 10 && @this.Day <= 19))
        {
            return "th";
        }
        else if(dayMod10 == 1)
        {
            return "st";
        }
        else if (dayMod10 == 2)
        {
            return "nd";
        }
        else
        {
            return "rd";
        }
    }

-1
一个简单实用的VB解决方案:
litDate.Text = DatePart("dd", Now) & GetDateSuffix(DatePart("dd", Now))

Function GetDateSuffix(ByVal dateIn As Integer) As String

    '// returns formatted date suffix

    Dim dateSuffix As String = ""
    Select Case dateIn
        Case 1, 21, 31
            dateSuffix = "st"
        Case 2, 22
            dateSuffix = "nd"
        Case 3, 23
            dateSuffix = "rd"
        Case Else
            dateSuffix = "th"
    End Select

    Return dateSuffix

End Function

-4

使用最后一个字符串字符的另一种选项:

public static string getDayWithSuffix(int day) {
 string d = day.ToString();
 if (day < 11 || day > 13) {
  if (d.EndsWith("1")) {
   d += "st";
  } else if (d.EndsWith("2")) {
   d += "nd";
  } else if (d.EndsWith("3")) {
   d += "rd";
  } else {
   d += "th";
 } else {
  d += "th";
 }
 return d;
}

谢谢AakashM,你是对的,我已经编辑过来纠正了错误。 - Jodda
现在它会给出“1th”,“2th”和“3th”。 - AakashM

-5

在MSDN文档中没有提到任何文化可以将17转换为17th。因此,您应该通过代码后台手动完成它。或者构建一个...您可以构建一个执行此操作的函数。

public string CustomToString(this DateTime date)
    {
        string dateAsString = string.empty;
        <here wright your code to convert 17 to 17th>
        return dateAsString;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接