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 格式标记在各种库和平台之间是不同的。据我所知,目前还没有开发出来的。
- This is the list of formatting tokens supported in Moment
- This is the list of formatting tokens supported in .NET,与Windowsdate/time区域设置中使用的大致相同
- Here is a moment plugin that does almost what you want,但它使用 Java 的标记集,而不是 Windows。您可以以此为基础进行实施。
请注意,您当前的函数缺少几个标记。特别是 am/pm 分隔符需要翻译,您还应该考虑文字和转义序列。
我正在做一个项目,在该项目中我得到了 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 格式标记在各种库和平台之间是不同的。据我所知,目前还没有开发出来的。
- This is the list of formatting tokens supported in Moment
- This is the list of formatting tokens supported in .NET,与Windowsdate/time区域设置中使用的大致相同
- Here is a moment plugin that does almost what you want,但它使用 Java 的标记集,而不是 Windows。您可以以此为基础进行实施。
请注意,您当前的函数缺少几个标记。特别是 am/pm 分隔符需要翻译,您还应该考虑文字和转义序列。