У меня есть простая ситуация, когда у меня есть номер недели X, указанный пользователем, и мне нужно узнать дату понедельника этой недели (например, 12 декабря). Как бы я этого добился? Я знаю год и неделю.
Узнать дату понедельника n-й недели в PHP?
Ответы (5)
Некоторый код основан в основном на предыдущих предложениях:
$predefinedYear = 2009;
$predefinedWeeks = 47;
// find first mоnday of the year
$firstMon = strtotime("mon jan {$predefinedYear}");
// calculate how much weeks to add
$weeksOffset = $predefinedWeeks - date('W', $firstMon);
// calculate searched monday
$searchedMon = strtotime("+{$weeksOffset} week " . date('Y-m-d', $firstMon));
Идея для начала:
- взять первый день года
- добавить 7 * X дней
- используйте strtodate, передав «последний понедельник» и дату, рассчитанную выше.
Возможно, потребуется добавить один день к вышеуказанному.
В зависимости от того, как вы вычисляете номера недель и начала недели, это может иногда отсутствовать. (т. е. если понедельник первой недели года фактически был в предыдущем году!)
ПРОВЕРЬТЕ ЭТО ТЩАТЕЛЬНО - но я использовал аналогичный подход для подобных расчетов в прошлом.
Из-за ограничения репутации я не могу публиковать несколько ссылок для проверки деталей.
http://php.net/manual/en/function.date.php и http://php.net/manual/en/function.mktime.php< /а>
вы можете использовать что-то вроде этого: используйте mktime, чтобы получить метку времени недели: $stamp = mktime(0,0,0,0,‹7*x>,) {использовал что-то подобное несколько лет назад, так что я не уверен, что это так работает}, а затем используйте $wDay = date('N',$stamp). Теперь у вас есть день недели, временная метка понедельника должна быть
mktime(0,0,0,0,‹7*x>-$wDay+1,) {параметр 'N' возвращает 1 для понедельника, 6 для воскресенья}
надеюсь это поможет
//To calculate 12 th Monday from this Monday(2014-04-07)
$n_monday=12;
$cur_mon=strtotime("next Monday");
for($i=1;$i<=$n_monday;$i++){
echo date('Y-m-d', $cur_mon);
$cur_mon=strtotime(date('Y-m-d', strtotime("next Monday",$cur_mon)));
}
Выход
2014-04-07
2014-04-14
2014-04-21
2014-04-28
2014-05-05
2014-05-12
2014-05-19
2014-05-26
2014-06-02
2014-06-09
2014-06-16
2014-06-23
Это решит проблему для вас. В основном это происходит из ответа Михаила Димитрова, но несколько упрощает и сужает это. Это может быть однострочное решение, если вы действительно этого хотите.
function getMondaysDate($year, $week) {
if (!is_numeric($year) || !is_numeric($week)) {
return null;
// or throw Exception, etc.
}
$timestamp = strtotime("+$week weeks Monday January $year");
$prettyDate = date('d M Y');
return $prettyDate;
}
Пара замечаний:
- Как и выше,
strtotime("Monday January $year")
даст вам метку времени первого понедельника года. - Как указано выше, +X недель увеличивает указанную дату на указанное количество недель.
Вы можете проверить это, попробовав:
date('c',strtotime('Sunday Jan 2018'));
// "2018-01-07T00:00:00+11:00" (or whatever your timezone is)
date('c',strtotime('+1 weeks Sunday Jan 2018'));
// "2018-01-14T00:00:00+11:00" (or whatever your timezone is)
date('c',strtotime('+52 weeks Sunday Jan 2018'));
// "2019-01-06T00:00:00+11:00"