我正在开展一个项目,我给出了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()函数。
答案 0 :(得分:1)
是的,您将需要转换功能,因为各种库和平台的日期/时间格式标记是不同的。我所知道的还没有一个已经开发出来的。
请注意,您当前的功能缺少多个令牌。特别是am / pm分隔符需要翻译,你也应该考虑文字和转义序列。