javascript - 使用 Intl.DateTimeFormat 获取 ISO 8601

标签 javascript localization

我想使用 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/

相关文章:

javascript - 程序无效且属性设置不正确

javascript - GetOrgChart 鼠标移动在 Chrome 和 Firefox 中损坏

c# - 自定义错误消息未在 ASP.NET MVC 4 中翻译

javascript - Pickadate:将日期转换为unix时间戳

javascript - React Native : styling props. child

javascript - 通过参数清除缓存

android - 将默认区域设置设置为 DatePicker 和 TimePicker

java - ResourceBundle/Properties 文件接受参数 {0} 中的字符串数组

javascript - 在 flipclock.js 上动态更改语言

objective-c - 在completionHandler中将变量传递到 block 之外 - __block 并没有帮助我