JavaScript: преобразование дня / недели в год

Я использую Stack Overflow уже несколько месяцев, но это мой первый пост.

Мне нужна функция для преобразования номера недели и дня недели в формат дд / мм / гггг.

Значения даты, с которыми мне нужно работать, имеют формат day/weekNumber. Так, например: 3/43 преобразуется в среду, 24 октября 20XX. Значение года будет текущим годом.

Значение дня начинается с 1 (понедельник).

Я нашел множество функций в Интернете (например, this, this и this). Некоторые работают с датами ISO 8601, и я не думаю, что они мне подходят. И я еще не нашел того, что мне подходит.

Заранее спасибо,


person Haden Griffiths    schedule 24.10.2012    source источник


Ответы (3)


Это решение требует добавления дополнительной библиотеки, но я думаю, что оно того стоит. Это библиотека momentjs для управления датой и временем. Он активно поддерживается и содержит отличную документацию. Как только вы получите значения day и weekNumber (в нашем случае 3 и 43), вы должны сделать следующее:

function formatInput(day, weekNumber){

    var currentDate = moment(new Date());     // initialize moment to a current date
    currentDate.startOf('year');              // set to Jan 1 12:00:00.000 pm this year
    currentDate.add('w',weekNumber - 1);      // add number of weeks to the beginning of the year (-1 because we are now at the 1st week)
    currentDate.day(day);                     // set the day to the specified day, Monday being 1, Sunday 7

    alert(currentDate.format("dddd, MMMM Do YYYY"));  // return the formatted date string 
    return currentDate.format("dddd, MMMM Do YYYY");
}

Я думаю, что эта библиотека может быть вам полезна позже, и есть много возможностей, касающихся манипулирования датой и временем, а также параметров форматирования. Также есть отличная документация, написанная для momentjs.

person Danilo Radenovic    schedule 24.10.2012
comment
Использование 12: 00: 00.000 вечера сбивает с толку и неоднозначно, поскольку нет единого мнения о том, означает ли 12 вечера полночь или полдень (строго говоря, это ни то, ни другое). Начало года - 2012-01-01 00:00:00, но это не первый день первой недели с использованием дат недели ISO, которая произошла в понедельник, 2 января 2012 года. - person RobG; 24.10.2012

Итак, если у вас есть значения 3 и 43 по отдельности, вы можете просто выполнить простую математику в первый день текущего года:

  • Получить 1 января текущего года
  • Добавить (43 * 7 + 3)

Что-то вроде этого может быть:

var currentDate = new Date();
var startOfYear = new Date(currentDate.getFullYear(), 0, 1);//note: months start at 0
var daysToAdd = (43 * 7) + 3;
//add days
startOfYear.setDate(startOfYear.getDate() + daysToAdd);

Вот пример


ИЗМЕНИТЬ

Поразмыслив, я думаю, что ошибся с вашими требованиями. Кажется, вам нужен определенный день недели. Проверьте это, чтобы найти лучшее решение.

Проблема в том, что все зависит от вашего определения недели. Этот год начинается в воскресенье, значит ли это, что 01.02.2012 (первый понедельник этого года) - это начало второй недели?

Мой последний пример сначала найдет начало указанной недели, а затем найдет следующее вхождение указанного дня.

person musefan    schedule 24.10.2012

Согласно ISO при работе с недельными датами неделя начинается в понедельник, а первая неделя года - это та, которая содержит первый четверг года. Таким образом, в 2012 году первая неделя началась в понедельник, 2 января, а первая неделя 2013 года - в понедельник, 31 декабря 2012 года.

Итак, если 3/43 - это третий день 43-й недели (это дата ISO 2012-W43-3), то его можно преобразовать в объект даты, используя:

function customWeekDateToDate(s) {
  var d, n;
  var bits = s.split('/');

  // Calculate Monday of first week of year this year
  d = new Date();   
  d = new Date(d.getFullYear(),0,1); // 1 jan this year
  n = d.getDay();
  d.setDate(d.getDate() + (-1 * n +( n<5? 1 : 8)));

  // Add days
  d.setDate(d.getDate() + --bits[0] + --bits[1] * 7);

  return d;
}

console.log(customWeekDateToDate('3/43')); // 01 2012-10-24

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

person RobG    schedule 24.10.2012