在PHP中获取给定周的开始和结束日期

在PHP中获取给定周的开始和结束日期,php,datetime,Php,Datetime,我试图用星期天作为开始日期和参考日期,比如说$date,来获取周范围,但我似乎无法理解它 例如,如果我的$date为2009-05-01,那么我将得到2009-04-26和2009-05-02。2009-05-10将产生2009-05-10和2009-05-16。我当前的代码是这样的(我不记得是从哪里取的,因为我忘了在我的评论中写下url): 我意识到它所做的只是在当前日期的基础上增加7天。您将如何做到这一点?我将充分利用PHP的惊人之处: function x_week_range(&

我试图用星期天作为开始日期和参考日期,比如说
$date
,来获取周范围,但我似乎无法理解它

例如,如果我的$date为2009-05-01,那么我将得到2009-04-26和2009-05-02。2009-05-10将产生2009-05-10和2009-05-16。我当前的代码是这样的(我不记得是从哪里取的,因为我忘了在我的评论中写下url):


我意识到它所做的只是在当前日期的基础上增加7天。您将如何做到这一点?

我将充分利用PHP的惊人之处:

function x_week_range(&$start_date, &$end_date, $date) {
    $ts = strtotime($date);
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts);
    $start_date = date('Y-m-d', $start);
    $end_date = date('Y-m-d', strtotime('next saturday', $start));
}
根据您提供的数据进行了测试,结果正常。不过,我并不特别喜欢你所说的全部参考资料。如果这是我的功能,我会这样做:

function x_week_range($date) {
    $ts = strtotime($date);
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts);
    return array(date('Y-m-d', $start),
                 date('Y-m-d', strtotime('next saturday', $start)));
}
list($start_date, $end_date) = x_week_range('2009-05-10');
这样称呼它:

function x_week_range($date) {
    $ts = strtotime($date);
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts);
    return array(date('Y-m-d', $start),
                 date('Y-m-d', strtotime('next saturday', $start)));
}
list($start_date, $end_date) = x_week_range('2009-05-10');

我不太喜欢为这样的事情做数学。日期很棘手,我更喜欢让PHP来解决这个问题。

老实说,我很难理解您发布的代码;)

我想像这样的事情应该会起作用:

function get_week($date) {
        $start = strtotime($date) - strftime('%w', $date) * 24 * 60 * 60;
        $end = $start + 6 * 24 * 60 * 60;
        return array('start' => strftime('%Y-%m-%d', $start),
                     'end' => strftime('%Y-%m-%d', $end));
}

不需要做太多的字符串操作,就可以对时间戳进行一些简单的计算

function getDateRange(&$start, &$end, $date) {
  $seconds_in_day = 86400;
  $day_of_week = date("w", $date); 
  $start = $date - ($day_of_week * $seconds_in_day);
  $end = $date + ((6 - $day_of_week) * $seconds_in_day);
}

这是我的版本,它使用了与Clay相似的概念:

/**
 * Start of the week
 *
 * 0 = Sun, 1 = Mon, etc.
 */
define( 'WEEK_START', 0 );

/**
 * Determine the start and end dates for
 * the week in which the specified date
 * falls
 *
 * @param $date Date in week
 * @param $start Week start (out)
 * @param $end Week end (out)
 */
function week_bounds( $date, &$start, &$end ) {
    $date = strtotime( $date );
    // Find the start of the week, working backwards
    $start = $date;
    while( date( 'w', $start ) > WEEK_START ) {
        $start -= 86400; // One day
    }
    // End of the week is simply 6 days from the start
    $end = date( 'Y-m-d', $start + ( 6 * 86400 ) );
    $start = date( 'Y-m-d', $start );
}

轻度测试。代码可能不会防弹,也不会处理遥远过去或未来的日期。使用风险自负。不要将代码浸入水中。不要向那些神经质或憎恨美元符号的人展示代码。没有在动物身上测试过。素食者使用安全。作者保证代码永远不会和你说话。如果代码试图让您参与对话,作者建议您忽略它给出的任何和所有建议。

显然,date()的“w”格式值或DateTime对象的format方法将以数字形式返回一周中的某一天(默认情况下,0=星期日,1=星期一等)

你可以用它减去当前日期的天数,得到一周的开始

$start_date = new DateTime("2009-05-13");
$day_of_week = $start_date->format("w");

$start_date->modify("-$day_of_week day");

$start_date现在将等于该周的星期日,从那以后,你可以再加7天来结束一周,或者你已经做了什么。

我决定改为使用at的方法。

在尝试寻找保罗·贝甘蒂诺(Paolo Bergantino)接受的答案的更精简版本时,我发现了一个非常好的方法来完成这一任务:

function x_week_range2($date) {
  $ts = strtotime($date);
  $start = strtotime('sunday this week -1 week', $ts);
  $end = strtotime('sunday this week', $ts);
  return array(date('Y-m-d', $start), date('Y-m-d', $end));
}

“本周星期日”字符串始终表示“本周结束时的星期日”。如果在星期日的时间戳上使用,则它将是下一个星期日。这使您可以避免在Paola的解决方案中使用三元运算符。

对于仍然使用mktime()、strotime()和其他PHP函数的所有人。。。尝试一下PHP5类。一开始我很犹豫,但它真的很容易使用。不要忘记使用clone()复制对象

编辑:最近编辑此代码以处理当前日期为星期日的情况。在这种情况下,我们必须得到过去的周六,然后再加上一天得到周日

$dt_min = new DateTime("last saturday"); // Edit
$dt_min->modify('+1 day'); // Edit
$dt_max = clone($dt_min);
$dt_max->modify('+6 days');
然后根据需要格式化

echo 'This Week ('.$dt_min->format('m/d/Y').'-'.$dt_max->format('m/d/Y').')';
确保在代码中尽早设置时区

date_default_timezone_set('America/New_York');

基于@jjwdesign的答案,我开发了一个函数,可以使用DateTime类计算特定日期的一周开始和结束时间将在PHP5.3.0++上运行

不同之处在于,您可以将所需的日期设置为0(星期一)和6(星期日)之间的“开始”

下面是函数:

if(function_exists('grk_Week_Range') === FALSE){
    function grk_Week_Range($DateString, $FirstDay=6){
        #   Valeur par défaut si vide
        if(empty($DateString) === TRUE){
            $DateString = date('Y-m-d');
        }

        #   On va aller chercher le premier jour de la semaine qu'on veut
        $Days = array(
            0 => 'monday',
            1 => 'tuesday',
            2 => 'wednesday',
            3 => 'thursday',
            4 => 'friday',
            5 => 'saturday',
            6 => 'sunday'
        );

        #   On va définir pour de bon le premier jour de la semaine     
        $DT_Min = new DateTime('last '.(isset($Days[$FirstDay]) === TRUE ? $Days[$FirstDay] : $Days[6]).' '.$DateString);
        $DT_Max = clone($DT_Min);

        #   On renvoie les données
        return array(
            $DT_Min->format('Y-m-d'),
            $DT_Max->modify('+6 days')->format('Y-m-d')
        );
    }
}
结果:

print_r(grk_Week_Range('2013-08-11 16:45:32', 0));
print_r(grk_Week_Range('2013-08-11 16:45:32', 1));
print_r(grk_Week_Range('2013-08-11 16:45:32', 2));
print_r(grk_Week_Range('2013-08-11 16:45:32', 3));
print_r(grk_Week_Range('2013-08-11 16:45:32', 4));
print_r(grk_Week_Range('2013-08-11 16:45:32', 5));
print_r(grk_Week_Range('2013-08-11 16:45:32', 6));

Array
(
    [0] => 2013-07-29
    [1] => 2013-08-04
)
Array
(
    [0] => 2013-07-30
    [1] => 2013-08-05
)
Array
(
    [0] => 2013-07-31
    [1] => 2013-08-06
)
Array
(
    [0] => 2013-07-25
    [1] => 2013-07-31
)
Array
(
    [0] => 2013-07-26
    [1] => 2013-08-01
)
Array
(
    [0] => 2013-07-27
    [1] => 2013-08-02
)
Array
(
    [0] => 2013-07-28
    [1] => 2013-08-03
)

从PHP日期时间文档:

<?php
$date = new DateTime();

$date->setISODate(2008, 2);
$startDay = $date->format('Y-m-d');

$date->setISODate(2008, 2, 7);
$endDay = $date->format('Y-m-d');
?>

使用此选项可从任何给定日期获取“周”数

//October 29, 2009 is my birthday
echo $week date('W', strtotime('2009-10-29'));
//OUTPUT: 44
//October 29 is the 44th week in the year 2009
现在将getWeekDates函数的参数传递为“year(2009)”和“$week”

有关更多信息,请参阅此链接

基于David Bélanger的版本(不幸的是,我的代表不允许我发表评论作为对他的文章的反应…)

当输入日期为星期一且一周的第一天设置为星期一时,原始版本返回上一周,而不是当前版本。 下面是一个小补丁(以及其他的orig.function):


现在可以使用DateTime获取一周的开始/结束日期

用法

print_r( getDateRangeForWeek("2016-05-07") );

print_r( getDateRangeForAllWeeks("2015-11-07", "2016-02-15") );

返回从开始日期时间到结束日期时间的天数的简单代码。使用gmdate()方法可以格式化日期/时间

$start_str_date = strtotime($start_date);
$end_str_date = strtotime($end_date);
$interval_days = $end_str_date - $start_str_date;
$days = gmdate('d',$interval_days);
echo $days;

我注意到这里的大多数答案都使用了
strotime/DateTime
。虽然正确,但就我个人而言,我宁愿不使用英语单词来计算日期

下面是一个利用
mtkime
的简单解决方案:

$now = time();
$day_of_week = (int)date('w', $now);

$week_start = mktime(0, 0, 0, date('n', $now), date('j', $now)-$day_of_week, date('Y', $now));
$week_end = mktime(23, 59, 59, date('n', $week_start), date('j', $week_start)+6, date('Y', $week_start));
例如:

$weekInformation = weekRange(2020, 38);

echo $weekInformation['start']; 
// Display: 2020-09-14

echo $weekInformation['end']; 
// Display: 2020-09-20

我使用以下方法来格式化最后一个星期天的日期:date('Y-m-d',strotime('last sunday'))试试PHP5 DateTime类@John M,请参阅下面我的评论,如果今天是星期天,而您想要本周,那么“上星期天”可能会有问题。如果您希望从星期一开始到星期天,那么代码中会有一些更改..函数x_week_range($date){$ts=strotime($date);$start=(date('w',$ts)==0)$ts:strotime('monday this week',$ts);返回日期('Y-m-d',$start);'to'.date('Y-m-d',strotime('sunday this week',$start));}同样可以通过date函数完成:
$day\u of_week date('w',strotime('start\u date));
$sunday=date('Y-m-d',strotime('-.$day\u of_week.'days',strotime('start\u date)));
除非我读错了,否则我不确定如果今天是星期天,这个逻辑是否有效。如果今天是星期天,并且您将
DateTime
对象设置为
last Sunday
,PHP将返回前一个星期天,而不是当前的星期天。因此,如果今天的日期是2016年2月28日,上述代码将响应
本周2016年2月21日-2016年2月27日ode>(实际上是前一周。星期一到星期六将隐藏此问题。我建议类似于
$dt_min=new DateTime(“上周六+24小时”);
函数可以工作。谢谢。但是,您的示例有点不对劲。它的日期是2013-08-11,那么它如何返回7-25到8-06的日期范围呢?8月11日不应该在某个地方吗?
$now = time();
$day_of_week = (int)date('w', $now);

$week_start = mktime(0, 0, 0, date('n', $now), date('j', $now)-$day_of_week, date('Y', $now));
$week_end = mktime(23, 59, 59, date('n', $week_start), date('j', $week_start)+6, date('Y', $week_start));
function weekRange($year, $week){
        $dateFrom = new \DateTime();
        $dateFrom->setISODate($year, $week);
        $dateTo = new \DateTime();
        $dateTo->setISODate($year, $week, 7);

        return array(
            'week' => $dateFrom->format('Y-W'),
            'start'=> $dateFrom->format('Y-m-d'),
            'end' => $dateTo->format('Y-m-d')
        );
    }
$weekInformation = weekRange(2020, 38);

echo $weekInformation['start']; 
// Display: 2020-09-14

echo $weekInformation['end']; 
// Display: 2020-09-20