我从服务器获取语言环境,并尝试根据此语言环境格式设置选项和其他选项来格式化给定日期。它适用于所有语言环境,但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中对其进行了测试。
这种奇怪行为来自何处,我该如何解决?
答案 0 :(得分:0)
不幸的是, toLocaleString 的实际日期格式在很大程度上implementation dependent,因此,尽管对于大多数常用语言和变体而言,日期格式可能是一致的,但对于不太常用的语言和变体而言,日期却不是那么好或通常使用多种日期格式的情况(我住的地方就是这种情况)。
情况非常复杂。 “语言环境”是BCP 47 language tag。 tags 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