我想使用 Intl.DateTimeFormat
格式化一个日期,在例子中它说
// when requesting a language that may not be supported, such as
// Balinese, include a fallback language, in this case Indonesian
太好了,所以我希望我的备用方案是ISO 8601,以防某种语言不存在
// i.e. the same as/similar to
new Date().toISOString(); // "2014-07-31T02:42:06.702Z"
不过
// Intl.DateTimeFormat([locales [, options]])
var o = {};
o.year = o.month = o.day = o.hour = o.minute = o.second = 'numeric';
new Intl.DateTimeFormat(['foo', 'iso8601'], o);
// RangeError: Invalid language tag: iso8601
这似乎是因为 iso8601
不是
locales
A string with a BCP 47 language tag, or an array of such strings.
我也尝试过使用我知道有效的方法,例如en-GB
带有 u-ca-iso8601
后缀,但这与没有后缀的结果没有任何不同
var f = new Intl.DateTimeFormat(['foo', 'en-GB-u-ca-iso8601'], o);
f.format(new Date());
// 31/7/2014 03:35:26
为什么这不起作用?是否有 locale
可以提供我正在寻找的输出?
我宁愿不必使用例如编写一些复杂的包装器
if (Intl.DateTimeFormat.supportedLocalesOf(['foo']).length === 0)
最佳答案
多年后,我发现基于“fo”或“foo”(法罗群岛)语言环境的已接受答案不再有效。也许正如 Jukka 推测的那样:法罗群岛当局决定切换(到 d/m/y)或者他们的语言环境信息得到了更正。
而且,不幸的是,所提议的明确“ISO8601”语言环境仍未添加,因此如果它真的发生,那还有很长的路要走。
关于@felixbuenemann 的评论,我有点困惑 Node 10 does not support locale data并且只为所有人提供“en-us”结果(可能是 Node 的自定义构建)。
但我同意加拿大语言环境(“fr-CA”和“en-CA”)是很好的替代品 - 重点是使用加拿大或瑞典等已采用 ISO 8601 的语言环境,因此语言环境格式是不太可能改变。瑞典 (sv-SE) 实际上比加拿大更好,因为它没有添加非标准的逗号并且使用了更符合标准的时区标识符。
所以,我的建议是
new Date().toLocaleString( 'sv-SE', o );
// where the options 'o' is defined as in the question or however you want
产生“2019-09-03 05:29:54”。请注意,空格分隔符而不是“T”也是符合标准的。不要在末尾附加“Z”(如问题中所示),除非您通过将 timeZone 选项设置为 GMT 来覆盖本地时间。
关于javascript - 使用 Intl.DateTimeFormat 获取 ISO 8601,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25050034/