javascript Intl.DateTimeFormat不关心'2-digit'或'numeric'

7xzttuei  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(153)

我想使用IntlDateTimeFormat提供前导零。我的代码是:

const timeFormatter = Intl.DateTimeFormat(undefined,{minute: '2-digit'});

const date = new Date();
date.setMinutes(4);

console.log(timeFormatter.format(date));  // PRINTS: 4 and not 04

但是,当我将second: '2-digit'添加到选项对象时。然后它工作正常,但也打印秒(是的,我可以使用替换删除它)。
那么“2-digit”和“numeric”有什么区别呢?
从现在起,我将忽略padStart。
我尝试将配置更改回“数字”而不是“2位”。似乎没有什么区别

szqfcxe2

szqfcxe21#

“2-digit”和“numeric”有什么区别?
并非所有选项都适用于所有选项组合的所有序列化。
(仅)对于支持以给定语言序列化2位数分钟的格式,该设置控制分钟将表示为1位数还是2位数。
Intl.DateTimeFormat.prototype.format()生成的格式化字符串 * 既 * 依赖于实现,也依赖于语言,因此它们不适合生成需要精确匹配模式的字符串。
其他组合也可能会产生你不期望的字符串:

const date = new Date(2023, 4, 10, 16, 4, 8);

const printFormatted = (opts) => console.log(new Intl.DateTimeFormat(undefined, opts).format(date));

printFormatted({ minute: "2-digit" });
printFormatted({ minute: "numeric", second: "numeric" });
printFormatted({ minute: "numeric", weekday: "long" });
printFormatted({ minute: "2-digit", weekday: "long" });

基于您问题中的示例代码:如果您的目标是将1位或2位整数转换为前导为0的2位字符串,那么String.prototype.padStart()是惯用的解决方案:

const date = new Date(2023, 4, 10, 16, 4, 8);

const zeroFour = String(date.getMinutes()).padStart(2, "0");

console.log(zeroFour); // 04

相关问题