使用MomentJS提取日期后缀以使其成为上标

Jam*_*lly 10 javascript momentjs

我遵循严格的用户界面指南,我需要在上标(<sup>)中显示日期后缀:

18 2015年9月

MomentJS有很多格式化日期的功能,但遗憾的是它似乎不允许我们提取日期后缀(上例中的th位)而不包括它之前的数字......

                Token    Output
Month           Mo       1st 2nd ... 11th 12th
Day of Month    Do       1st 2nd ... 30th 31st
Day of Year     DDDo     1st 2nd ... 364th 365th
...
Run Code Online (Sandbox Code Playgroud)

目前我正在使用以下方法剥离后缀之前的数值:

date.format("Do").replace(/\d/g, "");
--> "18th" -> "th"
Run Code Online (Sandbox Code Playgroud)

但问题是,当必须显示"2015年9月18日"之类的东西时,这会变得混乱,因为我不得不使用三个单独的format()呼叫:

var dateSuffix = "<sup>" + date.format("Do").replace(/\d/g, "") + "</sup">;
date.format("DD") + dateSuffix + date.format("MMMM YYYY");
--> "18<sup>th</sup> September 2015"
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望replace()完全避免使用,而是使用与此类似的东西,但Do部件仅用后缀替换:

moment(new Date()).format("DD<\\sup>Do</\\sup> MMMM YYYY");
--> "18<sup>18th</sup> September 2015"
Run Code Online (Sandbox Code Playgroud)

MomentJS是否有任何功能可以自行提取日期后缀?

Mar*_*ark 11

我为自己的项目看了这个,但决定采用正则表达式解决方案.

myDate.format( 'Do MMMM YYYY' ).replace( /(\d)(st|nd|rd|th)/g, '$1<sup>$2</sup>' );
Run Code Online (Sandbox Code Playgroud)

我很欣赏OP希望避免正则表达式,但这是一个简单的解决方案,可能对其他人有益.


Sim*_*mba 7

我不认为MomentJS具有您正在寻找的功能; 我想你应该去MomentJS网站并将其作为功能建议提交.你永远不会知道,它甚至可能得到实施.

同时,另一种选择可能是使用MomentJS中的配置选项来更改Ordinal字符串(即后缀),以便它们包含<sup>标记.

请参阅MomentJS手册中的相关部分:http://momentjs.com/docs/#/customization/ordinal/

你最终会编写一个如下所示的函数:

moment.locale('en', {
    ordinal: num => {
        const b = num % 10;
        const output = (~~(num % 100 / 10) === 1) ? 'th' :
            (b === 1) ? 'st' :
                (b === 2) ? 'nd' :
                    (b === 3) ? 'rd' : 'th';
        return num + '<sup>' + output + '</sup>';
    },
});
Run Code Online (Sandbox Code Playgroud)

以上示例直接从MomentJS的手册中提取,只是return修改了一行.