在PHP找出第n周的星期一的日期?

时间:2009-11-16 12:06:03

标签: php date week-number

我有一个简单的情况,我有一个用户提供的周号X,我需要找出那周的星期一的日期(例如12月12日)。我怎么做到这一点?我知道一年又一周。

5 个答案:

答案 0 :(得分:8)

部分代码主要基于之前的提案:

$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 :(得分:1)

让你入门的想法:

  • 一年中的第一天
  • 添加7 * X天
  • 使用strtodate,传入“上周一”和上面计算的日期。

可能需要在上面添加一天。

根据您计算周数和周开始的方式,有时可能会出现这种情况。 (即如果一年中第一周的星期一实际上是去年!)

彻底测试 - 但我过去曾采用类似的方法进行类似的计算。

答案 2 :(得分:0)

由于声誉限制,我无法发布多个链接 详情请查看

http://php.net/manual/en/function.date.phphttp://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,){''''参数在星期一返回1,在星期日返回6}

希望这会有所帮助

答案 3 :(得分:0)

  //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

答案 4 :(得分:0)

这将为您解决问题。它主要来自Mihail Dimitrov的答案,但在某种程度上对其进行了简化和浓缩。如果您确实希望它成为一种单行解决方案。

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"