具有格式选项的Intl.DateTimeFormat()对'it-CH'不起作用

时间:2018-10-13 20:33:58

标签: javascript date

我从服务器获取语言环境,并尝试根据此语言环境格式设置选项和其他选项来格式化给定日期。它适用于所有语言环境,但it-CH

date = new Date(2010,0,1)
new Intl.DateTimeFormat('it-CH', {day:'2-digit', month:'2-digit', year:'numeric'}).format(date)
// output: "01.01.2010"

正确的输出应为01/01/2010

它虽然适用于语言环境it

new Intl.DateTimeFormat('it', {day:'2-digit', month:'2-digit', year:'numeric'}).format(date)
// output: "01/01/2010"

如果我未在选项中包括年份格式,则使用语言环境it-CH

new Intl.DateTimeFormat('it-CH', {day:'2-digit', month:'2-digit'}).format(date)
// output: "01/01"

正确的输出应为01/01/2010。我在Windows和Mac OS的最新版本的Chrome中对其进行了测试。 这种奇怪行为来自何处,我该如何解决?

2 个答案:

答案 0 :(得分:0)

不幸的是, toLocaleString 的实际日期格式在很大程度上implementation dependent,因此,尽管对于大多数常用语言和变体而言,日期格式可能是一致的,但对于不太常用的语言和变体而言,日期却不是那么好或通常使用多种日期格式的情况(我住的地方就是这种情况)。

情况非常复杂。 “语言环境”是BCP 47 language tagtags and subtags的列表由IANA维护,并会不时更改。此外,格式到标签和子标签的映射取决于实现。

最重要的是,对于特定的语言和变体应采用哪种格式尚不确定,并且根本不支持大量的本地语言和变体(例如,部落语言)。因此,不要依赖 toLocaleString 来完成所有工作并始终保持正确状态。

将全部工作留给实现的另一种方法是使用 toLocaleString 作为各个组件的语言,以明确的格式手动格式化日期。这样,在不支持特定语言的情况下,您可以使用浏览器默认语言(请参见下面的PPS),并确信您在页面上放置的内容是清晰的,并且不会完全留给实现,例如< / p>

function getFormattedDate(d, lang){
  return d.getDate().toLocaleString(lang) + ' '
    + d.toLocaleString(lang, {month:'long'}) + ', '
    + d.toLocaleString(lang, {year:'numeric'});
}

var d = new Date();
['it-CH', 'en-GB', 'ar-EG', 'zu-ZA', 'hz', undefined].forEach(
  lang => console.log((lang||'Default') +
          ': ' + getFormattedDate(d, lang))
);

不要因为支持每种可能的格式和语言变体而挂断电话。与用逗号,破折号,斜杠或本地变体习惯使用的方式分隔各个组成部分相比,确保日期明确无比重要。在我的语言环境中查看正式信件时,日期以3种或4种不同的格式表示,通常在同一页面上使用两种不同的格式(例如,标题,文本和表格数据)。

PS :在使用 toLocaleString 之前,您还应该test for support

PPS :如果有一种方法可以在使用语言标签之前测试它是否受支持,那将是非常好的,但是据我所知这是不可能的。例如。在上面的示例中,“ hz”是Herero,这是南部非洲特定种族使用的一种语言,很可能不受任何浏览器支持,因此应使用浏览器的默认语言。

答案 1 :(得分:0)

您可以通过使用intl polyfill模块完全替代NodeJS的intl实现来解决此问题。

首次运行npm i --save intl

然后您需要用polyfill替换Intl:

Intl = require("intl")

就是这样。现在您可以尝试:

const date = new Date();
const options = {
        year: 'numeric',
        day: 'numeric',
        month: 'numeric',
        hour: 'numeric',
        minute: 'numeric'
    };
const dateFormatted = new Intl.DateTimeFormat('pt-BR', options).format(date);
console.log(dateFormatted);

//预期输出:24/09/2019 17:43