格式符合ISO 8601日期

时间:2017-12-18 21:41:15

标签: javascript date iso8601

我在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日期 - 最好是以区域设置感知的方式 - 或者我是否必须长时间地进行这些操作?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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字符串时添加的任何默认字段。