找出第n周的日期';PHP的星期一是什么时候?

找出第n周的日期';PHP的星期一是什么时候?,php,date,week-number,Php,Date,Week Number,我有一个简单的情况,我有一个用户提供的第X周,我需要找出该周的星期一日期(例如12月12日)。我将如何实现这一点?我知道年份和星期。一个让你开始的想法: 以一年的第一天为例 加上7*X天 使用strtodate,输入“last Monday”和上面计算的日期 可能需要在上述基础上增加一天 根据你计算周数的方式和一周的开始,有时可能会出现这种情况。(即,如果一年中第一周的星期一实际上是前一年!) 对此进行彻底的测试-但我在过去使用过类似的方法进行类似的计算。由于声誉限制,我无法发布多个链接 详

我有一个简单的情况,我有一个用户提供的第X周,我需要找出该周的星期一日期(例如12月12日)。我将如何实现这一点?我知道年份和星期。

一个让你开始的想法:

  • 以一年的第一天为例
  • 加上7*X天
  • 使用strtodate,输入“last Monday”和上面计算的日期
可能需要在上述基础上增加一天

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


对此进行彻底的测试-但我在过去使用过类似的方法进行类似的计算。

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

您可以使用以下内容: 使用mktime获取一周的时间戳:$stamp=mktime(0,0,0,0,,){几年前使用过类似的东西,所以我不确定它是否是这样工作的} 然后使用$wDay=date('N',$stamp)。现在有了一周中的某一天,星期一的时间戳应该是

mktime(0,0,0,0,-$wDay+1,){N参数返回1表示星期一,6表示星期日}


希望这有助于

一些主要基于先前提案的代码:

$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));

这将为您解决问题。它主要来源于米哈伊尔·迪米特罗夫的回答,但在某种程度上简化和浓缩了这一点。如果您真的希望,它可以是单线解决方案

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;
}
几点注意:

  • 如上所述,
    strotime(“1月1日星期一”)
    将为您提供一年中第一个星期一的时间戳
  • 如上所述,+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"
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;
}
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"