如何使用 Intl 获取工作日名称?

问题描述 投票:0回答:8

我想在我的 i18n-ed 应用程序中显示 7 个工作日的列表:

Sunday, Monday, Tuesday... Saturday

我依靠 Intl 全局对象来格式化日期/时间,但我找不到一种简单的方法来获取工作日名称。

我想我可以在 EPOCH 时间中添加一些天,以达到一周的第一天,但我找不到只打印工作日的格式化程序。

var date = new Date(0);
date.setDate(4 + day);
for (var i = 0; i < 7; i++) {
  var weekday = new Intl.DateTimeFormat(["en"], {
      weekday: "short" // ?? what should I put here
  }).format(date);
  console.log(weekday);
}

输出:

Sunday, January 4, 1970
Monday, January 5, 1970
Tuesday, January 6, 1970
Wednesday, January 7, 1970
Thursday, January 8, 1970
Friday, January 9, 1970
Saturday, January 10, 1970

所需输出:

Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday

我也想要一个较短版本的日子,例如

Sun, Mon, Tue...

或者,有没有办法从 Intl 获取工作日

strings
?我尝试通过控制台探索该对象,但找不到它们。

javascript internationalization ecmascript-intl
8个回答
12
投票

我被误导了,因为我使用的是 Intl polyfill,它还不支持

{ weekday: "short" }
作为选项。

使用本机 Intl 实现可以按预期工作。


11
投票

我在 2021 年使用 es6 的解决方案

/**
 * Return list of days
 * 🌍 localeName : name of local, f.e. en-GB, default es-MX
 * ✅ weekday    : format of weekday short/long (Default)
 */
function daysForLocale(localeName = 'es-MX', weekday = 'long') {
  const {format} = new Intl.DateTimeFormat(localeName, { weekday });
  return [...Array(7).keys()]
    .map((day) => format(new Date(Date.UTC(2021, 5, day))));
}

// ##############################################################
// testing daysForLocale function
// ##############################################################
console.log(daysForLocale());
// ['domingo','lunes',...,'viernes','sábado']
console.log(daysForLocale('en-GB', 'short'));
// ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri','Sat']
console.log(daysForLocale('ja-JP', 'short'));
// ['日', '月', '火','水', '木', '金','土']


7
投票

 const weekdayDateMap = {
  Mon: new Date('2020-01-06T00:00:00.000Z'),
  Tue: new Date('2020-01-07T00:00:00.000Z'),
  Wed: new Date('2020-01-08T00:00:00.000Z'),
  Thu: new Date('2020-01-09T00:00:00.000Z'),
  Fri: new Date('2020-01-10T00:00:00.000Z'),
  Sat: new Date('2020-01-11T00:00:00.000Z'),
  Sun: new Date('2020-01-12T00:00:00.000Z'),
};
const shortWeekdays = Object.keys(weekdayDateMap);

const getDayOfWeek = (shortName, locale = 'en-US', length = 'short') =>
  new Intl.DateTimeFormat(locale, { weekday: length }).format(weekdayDateMap[shortName]);

const getDaysOfWeek = (locale = 'en-US', length = 'short') =>
  shortWeekdays.map(shortName => getDayOfWeek(shortName, locale, length));


console.log(getDayOfWeek('Mon', 'de-DE')) // "Mo"

console.log(getDaysOfWeek('de-DE')) // ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]

注:

如果您每秒多次调用

Intl.DateTimeFormat
格式化程序,则创建一次格式化程序并重复使用它会更有效。


1
投票

Intl
(因此
Intl.js
)还没有一个 API 来获取工作日名称,所以你必须使用正确的选项来查询一堆天。未来可能会添加对此的支持,但现在你基本上不走运。 (至少,除非您通过修复手动增强
Intl.js
。)


0
投票

尝试改进最受欢迎的答案;顺便回答一下问题:

为什么要用 Date.UTC(2021, 1, day+1) 来初始化?

因为,您需要找到一个实际的日历周,您可以从中提取工作日字符串。

    function getWeekdayLocale(localeName = 'fr', weekday = 'long') {
          const format = new Intl.DateTimeFormat(localeName, { weekday }).format;
          return [...Array(7).keys()]
            .map((day) => format(new Date(Date.UTC(2021, 1, day+1))));
    }
    console.log(getWeekdayLocale())


0
投票

这是一个不必硬编码开始日期的版本

const format = (date) => new Intl.DateTimeFormat('ca', { 'weekday': 'long' }).format(date);
const d = new Date();
d.setHours(15, 0, 0, 0); /* normalise */
d.setDate(d.getDate() - d.getDay() - 1); /* Saturday */
const localeDayNames = [...Array(7)]
  .map((_, i) => format(d.setDate(d.getDate() + 1)));
console.log(localeDayNames);


0
投票

如果您不想使用周日到周六的硬编码日期,请使用以下带有

date-fns
Intl.DateTimeFormat
的解决方案。

import { startOfWeek, addDays } from 'date-fns'

export const getDaysOfWeek = (locale: string) => {
  const daysOfWeek = []
  const startDate = startOfWeek(new Date())
  const formatter = new Intl.DateTimeFormat(locale, { weekday: 'short' })
  for (let i = 0; i < 7; i += 1) {
    daysOfWeek.push(formatter.format(addDays(startDate, i)))
  }
  return daysOfWeek
}


-1
投票

更简单的解决方案:

let d = new Date();
let day_options = {
    timeZone: "America/New_York",
    weekday:"short"
};
let formatter = new Intl.DateTimeFormat([],day_options);
console.log(formatter.format(d));

输出:周四

© www.soinside.com 2019 - 2024. All rights reserved.