如何让Intl.DateTimeFormat()返回数字格式的星期值?
解决Intl.DateTimeFormat返回数字星期的需求
你之前的代码报错主要有几个问题:
timeZone: America/New_York缺少引号,应该写成字符串'America/New_York'now变量未定义,需要先声明- 用
day.format(now)返回的英文星期名称(比如Sunday)当数组索引,但你的数组存的是数字字符串,完全不匹配,自然拿不到值
下面给两种简便的实现方法:
方法1:直接基于时区转换获取星期数字
如果只是需要目标时区的星期数字(周日=0、周一=1...),可以先把时间转换为对应时区的日期,再用getDay()方法(该方法本身就返回0-6的星期值):
const now = new Date(); // 将当前时间转换为纽约时区的日期字符串,再转为Date对象 const nyDate = new Date(now.toLocaleString('en-US', { timeZone: 'America/New_York' })); const weekdayNumber = nyDate.getDay(); console.log('Weekday:', weekdayNumber);
方法2:用Intl格式化结果映射数字
这种方法贴合你原本使用Intl.DateTimeFormat的思路,先拿到星期名称,再通过映射表转成数字:
const now = new Date(); const dayFormatter = new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', weekday: 'long', }); // 定义星期名称到数字的映射表 const weekdayMap = { Sunday: 0, Monday: 1, Tuesday: 2, Wednesday: 3, Thursday: 4, Friday: 5, Saturday: 6 }; // 格式化后获取星期名称,再映射为数字 const weekdayName = dayFormatter.format(now); const weekdayNumber = weekdayMap[weekdayName]; console.log('Weekday:', weekdayNumber);
如果想更精准地提取星期部分,可以用formatToParts方法:
const now = new Date(); const formatParts = new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', weekday: 'long' }).formatToParts(now); // 从格式化结果中提取星期名称 const weekdayName = formatParts.find(part => part.type === 'weekday').value; const weekdayMap = { Sunday:0, Monday:1, Tuesday:2, Wednesday:3, Thursday:4, Friday:5, Saturday:6 }; const weekdayNumber = weekdayMap[weekdayName]; console.log('Weekday:', weekdayNumber);
内容的提问来源于stack exchange,提问作者Learner-Driver
相关产品推荐
相关产品推荐

