Узнать дату понедельника n-й недели в PHP? - PullRequest
0 голосов
/ 16 ноября 2009

У меня есть простая ситуация, когда у меня есть пользовательский номер недели X, и мне нужно узнать дату понедельника этой недели (например, 12 декабря).Как бы я этого достиг?Я знаю год и неделю.

Ответы [ 5 ]

8 голосов
/ 16 ноября 2009

Некоторые коды основаны в основном на предыдущих предложениях:

$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));
1 голос
/ 16 ноября 2009

Идея, с которой можно начать:

  • первый день года
  • добавить 7 * X дней
  • используйте strtodate, передавая "последний понедельник" и дату, вычисленную выше.

Может потребоваться добавить один день к вышеприведенному.

В зависимости от того, как вы рассчитываете номера недели и начала недели, это может иногда отсутствовать. (т. е. если бы понедельник первой недели года был фактически в предыдущем году!)

ПРОВЕРЬТЕ ЭТО Тщательно - но я использовал аналогичный подход для аналогичных расчетов в прошлом.

0 голосов
/ 12 июля 2018

Это решит проблему для вас. Это в основном вытекает из ответа Михаила Димитрова, но упрощает и несколько сокращает его. Это может быть однострочное решение, если вы действительно этого хотите.

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"
0 голосов
/ 03 апреля 2014
  //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)));
    }

Out Put

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
0 голосов
/ 16 ноября 2009

Из-за ограничения репутации я не могу разместить несколько ссылок для деталей проверьте

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 для воскресенья}

надеюсь, это поможет

...