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()函数正确处理。
是的,你需要一个转换函数,因为日期/时间格式化令牌在不同的库和平台上是不同的。我知道没有一个已经开发出来。
- This is the list of formatting tokens supported in Moment
- This is the list of formatting tokens supported in .NET,这是大致相同的视窗的日期/时间区设置中使用的那些。
- Here is a moment plugin that does almost what you want,但它使用Java的令牌集,而不是Windows。你可以基于你的实现。
请注意,您目前的功能缺少几个标记。特别是am/pm分隔符需要翻译,你也应该考虑文字和转义序列。
谢谢马特,您的帖子及其链接和所有内容。至于我的功能,是的,我意识到它缺少转换,正如你指出的那样。我现在只需要严格的最低限度就可以继续前进。我会尝试联系Moment.js小组,看看他们是否有计划添加对各种格式化程序的支持。我会接受你的答案作为最有帮助的(连同你的评论)。谢谢! – Jeach
我不明白你要做什么。你是否将一个日期传递给ASP.NET的moment.js? – Dmitry
@Dmitry我用一些例子更新了我的问题。希望有所帮助。 – Jeach
我很确定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