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

时间:2017-10-13 16:53:23

标签: momentjs iso

我正在开展一个项目,我给出了Microsoft日期/时间格式,这似乎与标准ISO formatting完全相同。

当我尝试使用Moment.js格式化日期时,它并没有正确显示。例如,我提供的格式有' yy'对于2位数的年份和' d'为1位数的日期。

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

或者我做错了什么?我错过了什么吗?

我真的很想尝试将ISO写入Moment.js格式转换器。

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

更新2017.10.16 17:32:

在评论中得到Matt Johnson的一个好问题之后,我再次阅读了我的帖子并意识到我已经在这个"嵌入式"网页项目,我可能并不清楚"窗口给我一个日期格式"的含义。所以我在回答他的问题时写了以下内容:

@MattJohnson,我的意思是我正在为客户端工作的Web项目是Windows应用程序内部的IE嵌入式(OLE)(已编译的二进制文件,而不是Web)。 Web应用程序的JavaScript部分"会谈"到桌面应用程序以便接收/发送数据。我收到的一个数据是" dateFormat"和" timeFormat"属性。我收到的值,我直接来自Windows机器(基于该操作系统的用户配置)。碰巧年/日都是小写的,导致Moment.js无法正确格式化日期。因此,我现在的转换。

示例:

调用

  。

矩()格式();

将产生

  

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

现在,如果我想根据Moment.js文档格式化它,我就这样做:

  

矩()格式(' MM / DD / YYYY');

要得到这个:

  

&#34 10 /二千零十七分之十三"

问题是Windows传递了这种格式:

  

" DD / MM / YYYY"

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

  

矩()格式(' DD / MM / YYYY');

给我这个:

  

" VE / 30 / yyyy的"

虽然我期待这个:

  

13/10/2017

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

更新2017.10.13 16:41:

我将微软的日期/时间格式与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方面做得更好,以优化功能并删除保护/恢复代码。

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

1 个答案:

答案 0 :(得分:1)

是的,您将需要转换功能,因为各种库和平台的日期/时间格式标记是不同的。我所知道的还没有一个已经开发出来的。

请注意,您当前的功能缺少多个令牌。特别是am / pm分隔符需要翻译,你也应该考虑文字和转义序列。