如何使用 Intl.DateTimeFormat 表示 MM/dd/yyyy, hh:mm tt

ass*_*ler 1 javascript format datetime

我需要以 MM/dd/yyyy, hh:mm tt 格式显示“en”和“es”区域设置的日期。这种方法工作正常,但它将日期显示为 MM/dd/yy,仅显示年份的最后两位数字,而不是条目年份。

const en = new Intl.DateTimeFormat('en', { dateStyle: 'short', timeStyle: 'short', hour12: true }).format(new Date());

const es = new Intl.DateTimeFormat('es', { dateStyle: 'short', timeStyle: 'short', hour12: true }).format(new Date());

console.log('En', en, 'Es', es);
Run Code Online (Sandbox Code Playgroud)

这种方法

const en = (new Date()).toLocaleString('en');
const es = (new Date()).toLocaleString('es');

console.log('En', en, 'Es', es);
Run Code Online (Sandbox Code Playgroud)

显示全年,但显示“es”区域设置的 24 小时格式。

这里我知道,当格式化大量日期时,最好创建一个 Intl.DateTimeFormat 对象并使用其 format 属性提供的函数。情况可能就是这样。我怎样才能让它发挥作用?

Rob*_*obG 7

我需要以 MM/dd/yyyy, hh:mm tt 格式显示“en”和“es”区域设置的日期。

使用语言代码表示“es”,然后修改格式与 Intl 对象的目的相反。它应该根据提供的语言标签和未修改的结果来格式化值。

应手动或使用库创建特定格式(本质上是相同的)。西班牙语和英语使用相同的数字字符,因此如果两种语言没有日期或月份名称,则可以显示相同的时间戳,例如

关于如何格式化 javascript 日期,已经存在大量问题。以下是使用 Intl 对象的示例:

// MM/dd/yyyy, hh:mm tt using Intl.DateTimeFormat

function formatDate(date) {
  let p = new Intl.DateTimeFormat('en',{
    year:'numeric',
    month:'2-digit',
    day:'2-digit',
    hour:'2-digit',
    minute:'2-digit',
    hour12: true
  }).formatToParts(date).reduce((acc, part) => {
      acc[part.type] = part.value;
      return acc;
  }, {});
  
  return `${p.month}/${p.day}/${p.year}, ${p.hour}:${p.minute} ${p.dayPeriod}`; 
}

console.log(formatDate(new Date()));
Run Code Online (Sandbox Code Playgroud)

按月/日/年的顺序向西班牙语读者展示日期可能会让他们(以及绝大多数说英语的人)感到非常困惑。页面以特定语言呈现,因此所有日期、数字等都应遵循该语言的约定。