我在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日期 - 最好是以区域设置感知的方式 - 或者我是否必须长时间地进行这些操作?
答案 0 :(得分:3)
如果您在处理的任何时候使用JavaScript的原生Date
类型,那么您就会陷入困境;该对象类型只能及时存储,内部表示为时间戳(absolute count of milliseconds since the UNIX epoch, not counting leap seconds)。各种get
*方法只根据存储的时间戳计算值,set
*方法根据请求的调整计算新的时间戳。如果您将任何内容设置为NaN
或undefined
,那么时间戳本身将变为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字符串时添加的任何默认字段。