使用Moment.js的区域设置和特定日期格式

Jek*_*yll 37 javascript locale localization momentjs

我在我的项目和格式化日期中使用Moment.js如下:

var locale = window.navigator.userLanguage || window.navigator.language;
moment.locale(locale);
someDate.format("L");
Run Code Online (Sandbox Code Playgroud)

它运作良好但有时我需要显示没有年份的日期.我不能使用类似的东西,someDate.format("MM/DD")因为在某些语言中它应该是someDate.format("DD/MM").我需要一些想法,L,LL,LLL但没有一年.

我能做什么?

LTS : 'h:mm:ss A',
LT : 'h:mm A',
L : 'MM/DD/YYYY',
LL : 'MMMM D, YYYY',
LLL : 'MMMM D, YYYY LT',
LLLL : 'dddd, MMMM D, YYYY LT'
Run Code Online (Sandbox Code Playgroud)

S M*_*han 24

好的.这有点可怕,但你知道它会是.

首先,您可以访问(例如)的实际格式字符串'L':

var formatL = moment.localeData().longDateFormat('L');
Run Code Online (Sandbox Code Playgroud)

接下来,您可以通过明智的正则表达式替换来执行一些手术:

var formatYearlessL = formatL.replace(/Y/g,'').replace(/^\W|\W$|\W\W/,'');
Run Code Online (Sandbox Code Playgroud)

(也就是说:删除YYYY,加上删除后留下的孤立分隔符)

然后,您可以在片刻格式调用中使用新的格式字符串:

someDate.format(formatYearlessL);
Run Code Online (Sandbox Code Playgroud)

这必然会做出一些假设:

  • 区域设置的月份+日数字格式的顺序与该区域设置的年份+月份+日期格式的顺序相匹配,并删除了年份.
  • 短格式仅在月和日之间使用分隔符(没有前导/尾随分隔符).
  • 短数字日期格式的分隔符始终为非字母数字.
  • 格式由数字元素和分隔符组成,而不是带有文章的句子格式(请参阅下面关于西班牙语和葡萄牙语的RGPT评论,这些评论也适用于其他语言的长格式).

快速回顾locale/*.js一下,这些假设适用于我检查的每个语言环境文件,但可能有一些语言环境违反它们.(ETA:下面的评论指出德国短日期格式违反了第二个假设)

作为一个额外的重要警告,这可能是脆弱的.未来版本的moment.js完全有可能改变当前数据的位置longDateFormat......

  • 这在几种文化中都不起作用.让我们以葡萄牙语为例:完整的日期将是:"14 de Fevereiro de 2016".如果您删除年份,在本例中为"2016",您将得到:"14 de Fevereiro de"这是错误的.正确的结果应该是"14 de Fevereiro".至少西班牙语有同样的问题(因此,我们已经在讨论这个问题中有超过6.5亿可能的用户).我看到其他语言会有同样的问题. (5认同)

Meg*_*per 7

据我了解,您可以使用 MomentJS 属性https://momentjs.com/docs/#/customization/long-date-formats/更改特定语言的日期格式(不含年份)

\n\n

例子:

\n\n
moment.updateLocale(\'en\', {\n  longDateFormat: {\n    LLL: "MMMM Do, LT", // Oct 6th, 4:27 PM\n  }\n});\n\nmoment.updateLocale(\'ru\', {\n  longDateFormat: {\n    LLL : \'D MMMM, HH:mm\', // 6 \xd0\xbe\xd0\xba\xd1\x82., 16:27\n  }\n});\n
Run Code Online (Sandbox Code Playgroud)\n