按星期几、周和年设置日期



我正在制作日历。我的日历上有每年在一周中的同一天重复的事件。

例如:

  • 事件一, 星期日 (0(, 第三周

  • 事件二,星期二 (2(,第 12 周

EventOne 应具有一个日期对象,该对象始终是当前年份第 3 周的星期日。

EventTwo 应具有一个日期对象,该对象始终是当前年份第 12 周的星期二。

function getDateOfISOWeek(w, y) {
var simple = new Date(y, 0, 1 + (w - 1) * 7)
var dow = simple.getDay()
var ISOweekStart = simple
if (dow <= 4)
ISOweekStart.setDate(simple.getDate() - simple.getDay() + 1)
else
ISOweekStart.setDate(simple.getDate() + 8 - simple.getDay())
return ISOweekStart
}
const date = getDateOfISOWeek(3, 2020)
console.log(date)

上面的函数会给我一周的第一天,我请求,但没有实现星期几,我一直在努力找到一个 Date 函数来做到这一点。

如果有任何方便的函数可以提供帮助,我很乐意使用 moment 或 date-fns,但如果我能找到原生的 JavaScript 解决方案,我更喜欢。

getDateOfISOWeek工作正常,尽管它有点笨拙。您只需要添加所需的天数即可获得所需的特定日期。

ISO 周从星期一开始,所以只需获得一周的开始并将日期数字减去 1 即可。星期日可以是 0 或 7,所以 ECMAScript 或 ISO 编号都可以。

/* Return date for start of ISO week in given year
** @param {number|string} week: required ISO week number
** @param {number|string} year: required year
** @returns {Date} date of Monday at start of week
*/
function getDateOfISOWeek(week, year) {
// Get date for 1 Jan in given year
let d = new Date(year, 0, 1);
let dow = d.getDay();
// Shift to start of ISO week 1
d.setDate((dow <= 4? 2 : 9) - d.getDay());

// Add required number of weeks
d.setDate(d.getDate() + (week - 1)*7);

return d;
}
/* Return date for a day in given ISO week in given year
** @param {number|string} day: day number, Mon=1, Tue=2, ... Sun=0 or 7
** @param {number|string} week: required ISO week number
** @param {number|string} year: required year
** @returns {Date} date of required day
*/
function getDayOfISOWeek(day, week, year) {
let d = getDateOfISOWeek(week, year);
d.setDate(d.getDate() + (+day || 7) - 1);
return d;
}
// Options for formatting dates
let opts =  {weekday:'short', day:'numeric', month:'short', year:'numeric'};
// Examples
[[1, 3,2020], // Mon, week 3, 2020
[0, 1,2020], // Sun, week 1, 2020
[7, 1,2020], // Sun, week 1, 2020
[5,10,2020], // Fri, week 10, 2020
[6,27,2022], // Sat, week 27, 2022
[2,12,2020], // Tue, week 12, 2020
[2,12,2021], // Tue, week 12, 2021
[2,12,2022]  // Tue, week 12, 2022
].forEach(args => console.log(
args + ': ' + getDayOfISOWeek(...args).toLocaleString(void 0, opts)
));

附言。你真的应该包括块的大括号和分号来终止语句,否则你可能会得到一些很难找到的错误。

我不确定,但如果我理解正确,您可以简单地使用 date-fns 来做到这一点:

var startOfYear = require('date-fns/start_of_year')
var getDay = require('date-fns/get_day')
var addDays = require('date-fns/add_days')
var addWeeks = require('date-fns/add_weeks')    
let getDateOfISOWeek = (w, y, d) => {
let startDayOfYear = startOfYear(new Date(y,0,1));
let diff = d - getDay(startDayOfYear);
let firstAppearanceOfYear = addDays(startDayOfYear, diff < 0 ? 7 + diff : diff);
return addWeeks(firstAppearanceOfYear, w - 1);
}
let result = getDateOfISOWeek(3, 2020, 0); //Sun Jan 19 2020
let result2 = getDateOfISOWeek(3, 2021, 0); // Sun Jan 17 2021

前两个参数 - 周和年,第三个 - 您正在寻找的日期索引(0 - 星期日,6 - 星期六(

你可以简单地实现一个这样的函数,方法是从周乘以 7 中减去偏移量;并根据 1 月 4 日计算偏移量(因为那天总是在第 1 周(

笔记:

  • 如果您将星期日视为一周的第一天,则将 0 传递为weekDay,而如果您将星期日视为一周的最后一天,则应传递 7。
  • week从 1 开始,传递1可能会导致日期具有上一年的值(例如createDate(2020, 1, 1)将于2019年12月30日返回。

function createDate(year, week, weekDay){
const date = new Date(year, 0, 4)
const offset = (date.getDay() || 7) - weekDay
date.setDate(week * 7 - offset - 3)
return date
}
console.log(createDate(2020,3,7).toDateString())
console.log(createDate(2021,3,7).toDateString())
console.log(createDate(2020,12,4).toDateString())
console.log(createDate(2021,12,4).toDateString())
console.log(createDate(2015,1,4).toDateString())

最新更新