Moment.js 不支持 Microsoft/ISO 格式?

Moment.js doesn't support Microsoft/ISO format?

我正在做一个项目,在该项目中我得到了 Microsoft date/time 格式,它似乎与标准 ISO formatting.

完全一样

当我尝试用 Moment.js 格式化日期时,结果不正确。例如,我提供的格式有 'yy' 表示 2 位数年份和 'd' 表示 1 位数日期。

当我查看 Moment.js format 文档时,我意识到它甚至不支持它?这有点奇怪?为什么它不支持标准?

还是我做错了什么?我错过了什么吗?

我真的不想尝试编写 ISO 到 Moment.js 格式转换器。

有没有人遇到同样的问题?如果是这样,你是如何解决这个问题的?


更新2017.10.1617:32:

在评论中收到 Matt Johnson 提出的一个好问题后,我再次阅读了我的 post 并意识到我已经在这个 "embedded" 网络项目中工作了很长时间,我可能是很清楚 "windows giving me a date format" 是什么意思。所以我写了以下内容来回答他的问题:

@MattJohnson,我的意思是我正在为客户开发的 Web 项目是 Windows 应用程序(编译的二进制文件,而非 Web)中的 IE 嵌入式 (OLE)。 Web 应用程序的 JavaScript 部分 "talks" 到桌面应用程序以便 receive/send 数据。我收到的数据之一是 "dateFormat" 和 "timeFormat" 属性。有人告诉我,我收到的值直接来自 Windows 机器(基于 OS 的用户配置)。碰巧 years/days 都是小写,导致 Moment.js 无法正确格式化日期。因此我现在有了转换。


示例:

通话中

moment().format();

会产生

"2017-10-13T13:24:47-04:00"

现在,如果我想根据 Moment.js 文档对其进行格式化,我会这样做:

moment().format('MM/DD/YYYY');

得到这个:

"10/13/2017"

问题是 Windows 传递这种格式:

"dd/MM/yyyy"

所以当我用它调用 Moment 时,例如:

moment().format('dd/MM/yyyy');

给我这个:

"Ve/30/yyyy"

当我期待这个时:

13/10/2017

当我查看许多其他日期格式化库时,我发现它们都支持 'yyyy'、'dd' 和 'MM' 结构。但不是 Moment.js.


更新2017.10.1316:41:

我比较了 Microsoft 的 date/time 格式和 Moment.js 的格式,发现了差异。

* ---------------------------------------------------------------------------------------------
 *  Unit            Microsoft           Examples                Moment.js           Differnces?
 * ---------------------------------------------------------------------------------------------
 *  day             d, dd               1, 01                   D, DD               Yes, case
 *  day of week     ddd, dddd           Fri, Friday             ddd, dddd           None
 *  month           M, MM, MMM, MMMM    8, 08, Oct., October    M, MM, MMM, MMMM    None
 *  year            yy, yyyy            17, 2017                YY, YYYY            Yes, case
 *  
 *  hour            h, hh, H, HH        3, 03, 15, 15           h, hh, H, HH        None
 *  minutes         m, mm               9, 09                   m, mm               None
 *  seconds         s, ss               5, 05                   s, ss               None
 */

利用这些信息,我很快写了一个格式转换函数:

function windowsFormatToMomentJSFormat(windowsFormat) {
  var format = windowsFormat;

  console.log("Converting date format...");

  if (!windowsFormat) return format;

  console.log(" > From    : '" + windowsFormat + "'");

  format = format.replace(/y/g, 'Y');       // Fix case for years
  format = format.replace(/d{4}/g, '#');    // Protect 4-digit DOW sequence
  format = format.replace(/d{3}/g, '&');    // Protect 3-digit DOW sequence
  format = format.replace(/d/g, 'D');       // Fix case for days
  format = format.replace(/#/g, 'dddd');    // Restore our sequence
  format = format.replace(/&/g, 'ddd');     // Restore our sequence

  console.log(" > To      : '" + format + "'");
  console.log(" > Applied : '" + moment().format(format) + "'");

  return format;
}

它似乎运行良好,尽管我希望我在高级 REGEX 方面做得更好,以便优化函数并删除 protect/restore 代码。

所以现在,我的 Windows 格式字符串似乎已被 Moment.js' format() 函数正确处理。

是的,您将需要一个转换函数,因为 date/time 格式标记在各种库和平台之间是不同的。据我所知,目前还没有开发出来的。

请注意,您当前的函数缺少几个标记。特别是 am/pm 分隔符需要翻译,您还应该考虑文字和转义序列。