为啥 toLocaleTimeString(),总是零填充分钟和秒

Posted

技术标签:

【中文标题】为啥 toLocaleTimeString(),总是零填充分钟和秒【英文标题】:Why toLocaleTimeString(), always zero-pad minute and second为什么 toLocaleTimeString(),总是零填充分钟和秒 【发布时间】:2021-12-07 11:08:48 【问题描述】:

我使用 javascript Date.prototype.toLocaleTimeString()(或等效:Intl.DateTimeFormat()


我想要时间的表示(尤其是 没有前导零(当 min/sec 小于 10 时)。

例如。 13:2:31:2:3 PM(不是 13:02:031:02:03 PM

但我做不到:

const date = new Date('2/21/2021, 13:2:3')

const t1 = date.toLocaleTimeString('en-US') // 1:02:03 PM
const t2 = date.toLocaleTimeString('en-US', timeStyle: 'medium') // 1:02:03 PM
const t3 = date.toLocaleTimeString('en-US', timeStyle: 'short') // 1:02 PM
const t4 = date.toLocaleTimeString('en-US', minute: '2-digit', second: '2-digit') // 02:03
const t5 = date.toLocaleTimeString('en-US', minute: 'numeric', second: 'numeric') // 02:03


console.log(t1 + '\n' + t2 + '\n' + t3 + '\n' + t4 + '\n' + t5)

根据MDN:

分钟

分钟的表示。 可能的值为"numeric""2-digit"

第二个的表示。 可能的值为"numeric""2-digit"


注意:我不想为此使用外部库。

【问题讨论】:

我认为numeric2-digit 之间的区别仅与年份相关,其中2 位数字代表世纪。 @Barmar,那为什么minutesecond 可以使用它们? 为什么?这使它看起来不再像时间,并且会引起混乱。 不知道,我认为这只是所有数字字段的一致性。 【参考方案1】:

不知道你为什么要这样做,但是嘿。

您可以使用formatToParts 并从您想要的任何类型中删除前导零:

const date = new Date('2/21/2021, 13:02:03')

const formatter = new Intl.DateTimeFormat(navigator.language, 
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric',
);

const dateString = formatter.formatToParts(date).map((type, value) => 
  switch (type) 
    case 'minute':
    case 'second':
        return value.replace(/^0/, '');
    default:
        return value;
  
).join('');


console.log(dateString)

【讨论】:

以上是关于为啥 toLocaleTimeString(),总是零填充分钟和秒的主要内容,如果未能解决你的问题,请参考以下文章

tolocaletimestring 啥意思

如何在不显示秒数的情况下使用 .toLocaleTimeString()?

date.toLocaleTimeString 不是函数

Safari 和 WebView 上的 toLocaleTimeString 转换为不正确的时间

为啥我们应该总是从函数返回值?

为啥 visualvm 中的“总时间”列与运行时持续时间不同?