Дата округления по нескольким неделям - PullRequest
0 голосов
/ 16 мая 2018

Даты начала текущей недели легко округлить, например:

function roundWeek() {
    var current = new Date();
    var startOfWeek = current.getDate() - current.getDay();
    console.log(new Date(current.setDate(startOfWeek)));
}
roundWeek();

Это прекрасно работает при округлении на одну неделю, но становится немного сложнее при округлении на несколько недель.

Например, скажем, я хотел бы округлить в трехнедельные периоды. Я знаю, что для этого потребуется эпоха (например, new Date(0)), чтобы правильно рассчитать начальную дату трехнедельного периода, но это также вызывает проблему:

1 января 1970 г. (что составляет new Date(0)) произошло в четверг, поэтому, предположив, что я использовал его следующим образом, он всегда вычислит начало недели в четверг:

function roundWeek(weeks) {
    var current = new Date();
    const WEEK_IN_MS = 60*60*24*7*1000; //sec * min * hr * day * ms
    var index = Math.floor( (current.getTime() / (WEEK_IN_MS*weeks)) );

    var startOfPeriod = new Date( index * WEEK_IN_MS*weeks );
    console.log( startOfPeriod );
}
roundWeek(3);

Как это можно изменить, чтобы оно правильно начиналось в воскресенье, а не в четверг? Есть ли лучший способ сделать это? И самое главное: может ли високосный год вызвать проблемы с этим?

1 Ответ

0 голосов
/ 16 мая 2018

Вам необходимо решить, хотите ли вы, чтобы трехнедельный период начинался в воскресенье до 1 января 1970 г. (28/12/69) или после.Например, к какому воскресенью 14 января 1970 года?Затем вы можете рассчитать разницу между четвергом или предыдущим воскресеньем или следующим воскресеньем и сложить или вычесть (в зависимости от принятого вами решения) это округленное решение.

Вот вариант вашей функции, который также требуетдата в качестве входных данных для тестирования.

function roundWeek(weeks, d) {
  var current = new Date(d);
  var first_sunday = 60 * 60 * 24 * 4 * 1000 // seconds between Sunday and Thursday
  const WEEK_IN_MS = 60 * 60 * 24 * 7 * 1000; // week in ms
  var index = Math.floor((current.getTime() / (WEEK_IN_MS * weeks)));
  console.log(`${weeks}-week periods from ${d.getMonth()+1}/${d.getDate()}/${d.getFullYear()} ${index}`)

  var startOfPeriod = new Date(index * WEEK_IN_MS * weeks - first_sunday);
  console.log("1st day of period:", startOfPeriod);
}
// round to three weeks starting Sunday before Jan 1 1970

roundWeek(3, new Date('January 2, 1970')); // Dec 28, 1968
roundWeek(3, new Date('January 14, 1970')); // Dec 28, 1968
roundWeek(3, new Date('January 22, 1970')); // next three weeks
roundWeek(3, new Date('May 16, 2018')); // since today. Sundaay May 6

Поскольку високосные годы не меняются, продолжительность недели не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...