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

问题描述:

我正在开发一个项目,我给出了微软的日期/时间格式,这个格式好像和标准的ISO formatting完全一样。Moment.js不支持Microsoft/ISO格式?

当我尝试使用Moment.js格式化日期时,它不能正确显示。例如,我提供的格式对于2位数年份具有“yy”,对于1位数月份具有“d”。

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

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

我真的很讨厌尝试写一个ISO到Moment.js格式转换器。

有没有人有同样的问题?如果是这样,你怎么解决这个问题?


更新二○一七年十月一十六日17:32:

在评论正从马特·约翰逊一个很好的问题下来后,我再次阅读我的文章,并意识到我已经工作了这么长时间这个“嵌入式”网络项目,我可能不太清楚“窗口给我一个日期格式”是什么意思。所以我写了以下回应他的问题:

@MattJohnson,我的意思是,我正在为客户端的Web项目是一个IE应用程序嵌入(OLE)在Windows应用程序(编译二进制,不是网络)。 Web应用程序的JavaScript部分与桌面应用程序“交谈”以接收/发送数据。我收到的一个数据是“dateFormat”和“timeFormat”属性。我收到的值,我被告知直接来自Windows机器(基于该操作系统的用户配置)。发生这种情况的原因是,年/日都是小写字母,导致Moment.js无法正确格式化日期。因此,我现在有了转换。


实例:

调用

力矩()格式();

会产生

“2017-10-13T13:24:47-04:00”

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

moment()。格式( 'MM/DD/YYYY');

为了得到这个:

“2017年10月13日”

的问题是,Windows沿着这种格式传递:

“DD/MM/yyyy“

So当我给它打电话时,像:

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

给我这个:

“VE/30/YYYY”

虽然我期待这样的:

13/10/2017

当我看着很多其他的da te格式化库,我发现他们都支持'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; 
} 

它似乎运作良好,但我希望我是在先进的正则表达式要好得多为了优化功能,并删除保护/恢复代码。

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

+0

我不明白你要做什么。你是否将一个日期传递给ASP.NET的moment.js? – Dmitry

+0

@Dmitry我用一些例子更新了我的问题。希望有所帮助。 – Jeach

+0

我很确定ISO8601没有定义在 日期解析器和格式器中使用什么图例。这些是库/ PL特定的。 ISO8601指定日期格式本身。 'moment().format();'产生一个ISO格式的日期时间。而且似乎'moment'使用https://www.w3.org/TR/NOTE-datetime中的传说。 Python例如使用完全不同的图例格式https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior。顺便说一句,你的“dd/mm/yyyy”完全违背ISO。 – Dmitry

是的,你需要一个转换函数,因为日期/时间格式化令牌在不同的库和平台上是不同的。我知道没有一个已经开发出来。

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

+0

谢谢马特,您的帖子及其链接和所有内容。至于我的功能,是的,我意识到它缺少转换,正如你指出的那样。我现在只需要严格的最低限度就可以继续前进。我会尝试联系Moment.js小组,看看他们是否有计划添加对各种格式化程序的支持。我会接受你的答案作为最有帮助的(连同你的评论)。谢谢! – Jeach