PHP按周编号获取一周的开始和结束日期

时间:2011-02-01 10:24:34

标签: php date

我在这个问题上看到了一些变种,但我相信这个尚未得到回答。

我需要获取一周的开始日期和结束日期,按年份和周数选择(不是日期)

示例:

输入:

getStartAndEndDate($week, $year);

输出:

$return[0] = $firstDay;
$return[1] = $lastDay;

返回值将类似于一个数组,其中第一个条目是星期开始日期,第二个条目是结束日期。

可选:当我们处于此状态时,日期格式必须为Y-n-j(正常日期格式,无前导零。

我已经尝试编辑几乎完成我想要的现有功能,但到目前为止我没有运气。

请提前帮助我。

15 个答案:

答案 0 :(得分:146)

使用DateTime类:

function getStartAndEndDate($week, $year) {
  $dto = new DateTime();
  $dto->setISODate($year, $week);
  $ret['week_start'] = $dto->format('Y-m-d');
  $dto->modify('+6 days');
  $ret['week_end'] = $dto->format('Y-m-d');
  return $ret;
}

$week_array = getStartAndEndDate(52,2013);
print_r($week_array);

返回:

Array
(
    [week_start] => 2013-12-23
    [week_end] => 2013-12-29
)

说明:

  • 创建一个新的DateTime对象,默认为now()
  • 调用setISODate将对象更改为$ year $ $周的第一天,而不是now()
  • 将日期格式化为“Y-m-d”并输入$ ret ['week_start']
  • 通过添加6天来修改对象,这将是$ week结束
  • 将日期格式化为'Y-m-d'并放入$ ret ['week_end']

较短版本(适用于> = php5.3):

function getStartAndEndDate($week, $year) {
  $dto = new DateTime();
  $ret['week_start'] = $dto->setISODate($year, $week)->format('Y-m-d');
  $ret['week_end'] = $dto->modify('+6 days')->format('Y-m-d');
  return $ret;
}

可以使用> = php5.4中的class member access on instantiation缩短。

答案 1 :(得分:40)

很多年前,我发现了这个功能:

function getStartAndEndDate($week, $year) {
  $dto = new DateTime();
  $dto->setISODate($year, $week);
  $ret['week_start'] = $dto->format('Y-m-d');
  $dto->modify('+6 days');
  $ret['week_end'] = $dto->format('Y-m-d');
  return $ret;
}

$week_array = getStartAndEndDate(52,2013);
print_r($week_array);

答案 2 :(得分:12)

我们可以轻松实现这一目标,而无需额外的计算,除了DateTime类固有的计算。

function getStartAndEndDate($year, $week)
{
   return [
      (new DateTime())->setISODate($year, $week)->format('Y-m-d'), //start date
      (new DateTime())->setISODate($year, $week, 7)->format('Y-m-d') //end date
   ];
}

setISODate()函数分别有三个参数:$year$week$day,其中$day默认为1 - 一周的第一天。因此,我们通过7来获得$week的第7天的确切日期。

答案 3 :(得分:10)

稍微整洁的解决方案,使用“[年] W [周] [日]”strtotime格式:

function getStartAndEndDate($week, $year) {
  // Adding leading zeros for weeks 1 - 9.
  $date_string = $year . 'W' . sprintf('%02d', $week);
  $return[0] = date('Y-n-j', strtotime($date_string));
  $return[1] = date('Y-n-j', strtotime($date_string . '7'));
  return $return;
}

答案 4 :(得分:3)

最短的方式:

function week_date($week, $year){
    $date = new DateTime();
    return "first day of the week is ".$date->setISODate($year, $week, "1")->format('Y-m-d')
    ."and last day of the week is ".$date->setISODate($year, $week, "7")->format('Y-m-d'); 
}
echo week_date(12,2014);

答案 5 :(得分:2)

这是一个老问题,但上面发布的许多答案似乎都是不正确的。 我提出了自己的解决方案:

function getStartAndEndDate($week, $year){
    $dates[0] = date("Y-m-d", strtotime($year.'W'.str_pad($week, 2, 0, STR_PAD_LEFT)));
    $dates[1] = date("Y-m-d", strtotime($year.'W'.str_pad($week, 2, 0, STR_PAD_LEFT).' +6 days'));
    return $dates;
}

答案 6 :(得分:2)

您可以从日期开始获取星期几,就像我得到的第一天和最后一天一样

$date = date_create();

// get the first day of the week
date_isodate_set($date, 2019, 1);

    //convert date format and show     
    echo date_format($date, 'Y-m-d') . "\n";

// get the last date of the week
date_isodate_set($date, 2019, 1, 7);

     //convert date format and show        
     echo date_format($date, 'Y-m-d') . "\n";
  

输出=>

     

2018-12-31

     

2019-01-06

答案 7 :(得分:1)

首先,我们需要从那一周开始一天,因此通过了解周数并知道一周有七天我们将会这样做

$pickADay = ($weekNo-1) * 7 + 3;

这样,pickAday将是我们所需的一周中的一天。

现在因为我们知道这一年我们可以检查哪一天。 如果我们只需要比unix时间戳更新的日期,那么事情很简单  我们将获得一年中第一天的unix时间戳并添加到24*3600*$pickADay,这一切都很简单,因为我们有时间戳,我们可以知道它是星期几,并计算头部和尾部相应的那一周。

如果我们想要找出1848年第12周的相同内容,我们必须使用另一种方法,因为我们无法获得时间戳。知道每一年的每一天都会提前1个工作日的意思(去年11月1日是星期日,今年是星期一,闰年的例外是2天我相信,你可以检查一下)。如果年份大于1970年,我会做什么,而不是在它和需要的年份之间做出差异,知道有多少年,计算星期几,因为我的pickADay是1970年的一部分,每个工作日返回一个。 $shiftTimes = ($yearDifference + $numberOfLeapYears)%7,区别于此。转移一天的后退词$ shiftTimes,那么你就会知道那几年的那一天是哪一天,然后找到周末和周尾。如果它看起来更简单,也可以用于未来。尝试它,如果它的工作,并告诉我,如果它没有。

答案 8 :(得分:1)

Roham Rafii的计算是错误的。这是一个简短的解决方案:

// week number to timestamp (first day of week number)
function wn2ts($week, $year) {
    return strtotime(sprintf('%dW%02d', $year, $week));
}

如果您想要一周中的最后一天,可以加6 * 24 * 3600

答案 9 :(得分:1)

有关文档(由于Google在搜索“ php datetime start this week end”时将其排在首位)。

如果您需要当前星期的开始日期和结束日期(使用DateTime):

$dateTime = new DateTime('now');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');

var_dump($monday->format('Y-m-d')); // e.g. 2018-06-25
var_dump($sunday->format('Y-m-d')); // e.g. 2018-07-01

希望这会有所帮助。

答案 10 :(得分:0)

你试过PHP relative dates吗?它可能会奏效。

答案 11 :(得分:0)

即使您不想使用特定日期,也无法逃避它。您只能根据日期计算一周。

步骤:

  1. 获得一年中的第一天
  2. 决定第一周何时开始(如果我记得的话,有一些规则包括第一个星期四。
  3. 添加一些周(你的第一个参数)。 Zend_Date有一个add()函数,例如你可以添加周。这将为您提供一周的第一天。
  4. 抵消并获得最后一天。
  5. 我建议您使用Zend_DatePear Date等一致日期系统。

答案 12 :(得分:0)

if(Request::is('/')) {
   class="index"
}

将打印

$dateParam = '2018-06-10';
$week = date('w', strtotime($dateParam));
$date = new DateTime($dateParam);
$firstWeek = $date->modify("-".$week." day")->format("Y-m-d H:i:s");
$endWeek = $date->modify("+6 day")->format("Y-m-d H:i:s");
echo $firstWeek."<br/>";
echo $endWeek;

希望会有所帮助

答案 13 :(得分:0)

“一周的第一天”是主观的。一些文化使用“星期一”,其他文化使用“星期日”,也许其他使用其他语言?

出于我的目的,我希望一周的第一天为“周日”,一周的最后一天为“周六”。

此外,不使用任何参数的DateTime将默认为“现在”,其中包括当前时间。下面的方法通过在DateTime构造函数中指定“今天”来忽略当前时间。

此外,字符串“本周的星期日”似乎并不可靠。实际上,它将在下周的星期日返回(根据我对一周的看法)。

我建立了一个方法,该方法返回一个包含两个DateTime对象的PHP对象。一个用于给定星期的第一天(星期日),第二个用于给定星期的最后一天(星期六)。

function get_first_and_last_day_of_week( $year_number, $week_number ) {
    // we need to specify 'today' otherwise datetime constructor uses 'now' which includes current time
    $today = new DateTime( 'today' );

    return (object) [
        'first_day' => clone $today->setISODate( $year_number, $week_number, 0 ),
        'last_day'  => clone $today->setISODate( $year_number, $week_number, 6 )
    ];
}

答案 14 :(得分:-1)

function getStartAndEndDate($week, $year)
    {
        $week_start = new DateTime();
        $week_start->setISODate($year,$week);
        $return[0] = $week_start->format('d-M-Y');
        $time = strtotime($return[0], time());
        $time += 6*24*3600;
        $return[1] = date('d-M-Y', $time);
        return $return;
    }