格式符合ISO 8601日期

问题描述 投票:0回答:2

我在javascript变量中有一个ISO日期字符串,我想将其格式化以便显示。很简单,你可能会想。例如:

new Date(iso).toDateString()

但是,ISO日期可能只代表一年(“yyyy”),或一年和一个月(“yyyy-mm”);他们并不总是“yyyy-mm-dd”。在这种情况下,解析方法填写缺少字段的默认值,我不想看到。

换句话说,我只想格式化ISO字符串中定义的日期字段,而不是其他字段。如果ISO字符串是“2017-12”,那么我可能希望它格式化为2017年12月12日,2017年12月,2017年4月的格式之一,具体取决于我的区域设置和详细程度;我不想要一天的电话号码。同样,如果ISO字符串只是“2017”,那么我不想要一天或一个月的指示。

此问题主要与省略的ISO表格有关,因此不重复。

是否有一种简单的方法可以正确地格式化这样的ISO日期 - 最好是以区域设置感知的方式 - 或者我是否必须长时间地完成这些操作?

javascript date iso8601
2个回答
3
投票

如果您在处理的任何时候使用JavaScript的本机Date类型,那么您就会陷入困境;该对象类型只能及时存储,内部表示为时间戳(absolute count of milliseconds since the UNIX epoch, not counting leap seconds)。各种get *方法只根据存储的时间戳计算值,而set *方法根据请求的调整计算新的时间戳。如果你设置任何东西到NaNundefined,那么时间戳本身变成NaN,所有get *方法同样会返回NaN

如果您正在处理具有不确定或未指定组件的日期和时间,您可能最好完全避开Date;只使用一个只包含已定义值的字段的通用Object,并编写自己的解析器和格式化程序来匹配。如果你可以提取字符串的相关部分,你仍然可以使用本机Date方法和对象来处理棘手的部分,比如将可能缩写的月份名称转换为区域敏感方式的数字。


0
投票

这个解决方案基于Mark Reed的一些评论,是我最终采用的解决方案。

对于省略的ISO表格(yyyy-mm或yyyy)没有默认支持。要求必须使用Date对象来确定其他输出字段,例如一周中的某一天(如果在ISO字符串中指定了一天),例如“星期日”。但是,Date对象存储时间戳,因此在解析省略的ISO字符串时必须默认缺少的字段。此外,它还需要使用区域设置感知库,例如moment.js。

尽管在解析期间缺少字段(例如日期或月份)将被默认,但是可以在格式化阶段再次消除它们,并且可以基于原始省略的ISO字符串的长度来选择相关的格式化字符串。

该解决方案应该基于moment.js,通过为被省略的表格定义新的本地化格式字符串(类似于L,LL,LLL等),例如, LYM / lym处理YYYY-MM ISO案例。例如:

var LY = "YYYY";        // e.g. 2017
var ly = "YY";
var LYM = "MMMM YYYY";      // e.g. December 2017
var lym = "MMM YYYY";
var LYMD = "dddd MMMM D, YYYY";
var lymd = "ddd MMM D, YYYY";   // e.g. Tuesday December 19, 2017

这些格式化字符串将有效地忽略解析ISO字符串时添加的任何默认字段。

© www.soinside.com 2019 - 2024. All rights reserved.