moment js 显示 AM/PM 之后的毫秒数

Joh*_*amb 1 javascript date-formatting momentjs

目前正在开发一个处理不同语言的项目,并且在以 PM/AM 格式显示毫秒时遇到了奇怪的行为。

如果我想使用 AM/PM 格式显示毫秒精度的日期/时间对,我会得到如下内容:

12/14/2017 3:45:45 PM.199
Run Code Online (Sandbox Code Playgroud)

而 24 小时格式的相同日期/时间显示如下:

12/14/2017 15:45:45.199
Run Code Online (Sandbox Code Playgroud)

有没有办法显示 AM/PM 格式,如下所示:

12/14/2017 3:45:45.199 PM
Run Code Online (Sandbox Code Playgroud)

目的是根据用户本地化选项显示日期/时间,这就是我使用“L LTS”格式的原因。

这是一个小提琴来说明问题

var divEn = $('#divEn');
var divFi = $('#divFi');
var en = "en";
var pt = "pt";
var dateEn = moment().locale(en);
var dateFi = moment().locale(pt);
format = "L LTS.SSS";
divEn.text(dateEn.format(format));
divFi.text(dateFi.format(format)); 
Run Code Online (Sandbox Code Playgroud)

Vin*_*zoC 5

如果您总是想显示结果,例如12/14/2017 3:45:45.199 PM用作格式MM/DD/YYYY h:mm:ss.SSS A令牌而不是L LTS.SSS.

MM代表月份数、 代表DD月份中的日期、YYYY代表年份、代表h小时 (0..12)、mm代表分钟、ss代表秒、SSS代表秒小数和A代表 AM/PM。

LLTS是本地化标记(输出因区域设置而异)。

编辑:

您可以使用localeData()longDateFormat()获取本地化格式令牌,然后您可以检查令牌是否LTS包含 AM/PM 令牌(Aa)并动态更改格式。

这是一个实时示例:

function getCustomLocalizedFormat(locale){
  var localeData = moment.localeData(locale);
  var lts = localeData.longDateFormat('LTS');
  var format = "L LTS.SSS";
  if( lts.match(/a/i) ){
    format = "L h:mm:ss.SSS A";
  }
  return format;
}

var divEn = $('#divEn');
var divFi = $('#divFi');
var divRes = $('#divRes');
var en = "en";
var pt = "pt";
var dateEn = moment().locale(en);
var dateFi = moment().locale(pt);

var enLocaleData = moment.localeData('en');
var formatEn = getCustomLocalizedFormat('en');
var formatPt = getCustomLocalizedFormat('pt');

divEn.text(dateEn.format(formatEn));
divFi.text(dateFi.format(formatPt));
divRes.text(moment().format('MM/DD/YYYY h:mm:ss.SSS A'));
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.4/moment-with-locales.min.js"></script>

<p>English</p>
<div id="divEn"></div> 
<p>Portuguese</p>
<div id="divFi"></div>
<p>General</p>
<div id="divRes"></div>
Run Code Online (Sandbox Code Playgroud)

请注意:

  • 此方法并未针对 momentjs 支持的每个语言环境进行测试。pa-in(旁遮普语)、(ml马拉雅拉姆语)、ne(尼泊尔语)、hi(印地语)、gom-latn(康卡尼拉丁文脚本) 等语言环境的LTS标记以以下开头A。我不清楚这些语言环境的预期输出是什么。
  • 您可以使用功能和按键自定义长日期格式updateLocalelongDateFormat

最好的方法可能是定义受支持的语言环境的子集,并为每个语言环境定义自定义格式(和/或只是自定义的时刻LTS)。