使用PHP获得一周的第一天?


124

给定日期MM-dd-yyyy格式,有人可以帮助我获得一周的第一天吗?


4
一周的第一天是什么意思?你是说周日,星期一吗?还是您指的是一周中第一天的日期?
Jeffrey Hines

2
一周的第一天是恒定的:它是星期一(或可能是星期日)。您是否要获取给定任意日期之前的星期一的日期?
乔恩·克拉姆

什么版本的PHP-4或5?
乔恩·克拉姆

星期几的日期。PHP 5
Iggy Ma

奇怪的是,他要求一种DateTime解决方案,但大多数答案都没有提供解决方案。=)

Answers:


143

这是我正在使用的...

$day = date('w');
$week_start = date('m-d-Y', strtotime('-'.$day.' days'));
$week_end = date('m-d-Y', strtotime('+'.(6-$day).' days'));

$ day包含一个从0到6的数字,代表星期几(星期日= 0,星期一= 1,依此类推)。
$ week_start包含当前星期几的日期,格式为mm-dd-yyyy。
$ week_end包含当前星期六的日期,格式为mm-dd-yyyy。


1
但是,这意味着“本周”的开始和结束,对吧?
Oki Erie Rinaldi

如果给出周数怎么办?我希望它返回该周的开始和结束日期。
Oki Erie Rinaldi

1
@OkiErieRinaldi您可能应该打开一个新问题,以获得适当的关注。
JadedCore

别担心,我知道了@JadedCore!
Oki Erie Rinaldi

我不知道为什么另一个更高。它不起作用,但是这个起作用!3v4l.org/q6kKY
Jason

67
strtotime('this week', time());

替换time()。当当前日期为星期日/星期一时,下一个星期日/最后一个星期一的方法将不起作用。


55
$monday = strtotime('last monday', strtotime('tomorrow'));
刘易斯·巴克利

this week如果您需要始终有上一周的开始时间,则无法正常工作,但是@LewisBuckley的评论可以做到。
Smar 2013年

time()如果要今天指定,第二个参数是可选的。
如果不是2014年

不适用于我,我不得不为YTD,MTD,WTD设置稍微不同的语法。
罗恩

6
该答案产生不一致的结果,具体取决于所使用的PHP版本:3v4l.org/Z3k4E @LewisBuckley的解决方案对于所有版本都是一致的:3v4l.org/Eeh9c
Chris Baker

62

使用strtotime功能非常简单:

echo date("Y-m-d", strtotime('monday this week')), "\n";   

echo date("Y-m-d", strtotime('sunday this week')), "\n";

跨PHP版本有所不同:

5.3.0-5.6.6,php7 @ 20140507-20150301,hhvm-3.3.1-3.5.1的输出

2015-03-16
2015-03-22

4.3.5-5.2.17的输出

2015-03-23
2015-03-22

4.3.0-4.3.4的输出

2015-03-30
2015-03-29

边缘案例比较

本周这样的相对描述有其各自的背景。以下显示了本周一和周日在周一或周日的输出:

$date = '2015-03-16'; // monday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

$date = '2015-03-22'; // sunday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

Againt 在PHP版本之间有所不同

5.3.0-5.6.6,php7 @ 20140507-20150301,hhvm-3.3.1-3.5.1的输出

2015-03-16
2015-03-22
2015-03-23
2015-03-29

4.3.5-5.0.5、5.2.0-5.2.17的输出

2015-03-16
2015-03-22
2015-03-23
2015-03-22

5.1.0-5.1.6的输出

2015-03-23
2015-03-22
2015-03-23
2015-03-29

4.3.0-4.3.4的输出

2015-03-23
2015-03-29
2015-03-30
2015-03-29

为什么这对日期2016-06-05不起作用,它给出了下个星期的日期。

1
为此,我刚刚修改了这段代码,以便可以传递可选的日期参数$ dt = $ custom_date?strtotime($ custom_date):time(); $ monday = date(“ Ymd”,strtotime('本周星期一',$ dt)); $ sunday = date(“ Ymd”,strtotime('sunday this week',$ dt));
罗恩·迈克尔

47

把事情简单化 :

<?php    
$dateTime = new \DateTime('2020-04-01');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');    
?>

资料来源:PHP手册

注意:正如某些用户评论的那样,$ dateTime值将被修改。


编辑:错字或一些未知的语法?\从何而来?$dateTime = new \DateTime('2012-05-14');
Sliq

2
我这样做是为了避免与应用程序可能的自动加载对象发生任何冲突。这就像绝对路径或相对路径。
job3dot5 2012年

9
@Panique-“未知语法”是PHP 5.3的命名空间语法。Namespacing允许您在类的名称前加上反斜杠。在这里,他在不使用命名空间的情况下使用它来指定核心DateTime类,这意味着即使您DateTime在当前命名空间中调用了另一个类,代码也可以工作。
Spudley

日期名称是否总是英文?
Marwelln

1
克隆部分无法正常工作。如果需要原始克隆,应首先克隆,然后对克隆进行操作。
Farid Movsumov,

25
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));

这样就可以给定日期本身的星期几,其中0=周日和6=周六。从那里,您可以简单地计算到所需的日期。


6
该答案将返回给定日期是星期天还是星期一等。但是,发问者已在其对原始问题的评论中提及,要求提供给定日期的星期几。
拉基布

19

这个问题需要一个好的DateTime答案:-

function firstDayOfWeek($date)
{
    $day = DateTime::createFromFormat('m-d-Y', $date);
    $day->setISODate((int)$day->format('o'), (int)$day->format('W'), 1);
    return $day->format('m-d-Y');
}

var_dump(firstDayOfWeek('06-13-2013'));

输出:-

string '06-10-2013' (length=10)

这将处理年份界限和leap年。


18

编辑:下面的链接不再在所述的PHP版本上运行。它在PHP 5.6上运行,可提高strtotime的可靠性,但并不完美!表中的结果是PHP 5.6的实时结果。

值得一提的是,这是确定一致的参考框架时strtotime的怪异行为的分解:

http://gamereplays.org/reference/strtotime.php

基本上,无论您当前处于星期几,何时调用它们,只有这些字符串都能可靠地为您提供相同的日期:

strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday"); 

文章还提供了一些特定的代码:$ start_of_week = strtotime(“下周一-1周”); //将返回从00:00:00“开始的当前一周的星期一” $ end_of_week = strtotime(“下周一-1秒”); //将返回从23:59:59开始的当前一周的星期日“
斯科特M.Stolz

11

以下代码应与任何自定义日期一起使用,仅使用所需的日期格式。

$custom_date = strtotime( date('d-m-Y', strtotime('31-07-2012')) ); 
$week_start = date('d-m-Y', strtotime('this week last monday', $custom_date));
$week_end = date('d-m-Y', strtotime('this week next sunday', $custom_date));
echo '<br>Start: '. $week_start;
echo '<br>End: '. $week_end;

我使用PHP 5.2.17结果测试了代码:

Start: 30-07-2012
End: 05-08-2012

1
值得一提的是,这将始终返回上一个星期一,因此,如果$ custom_date是星期一,它将返回一周前的星期一。
2013年

2
无法正常运行,今天是星期天,结果是:开始:
2013年

10

假设星期一为一周的第一天,则可以执行以下操作:

echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));

1
“ MM-dd-yyyy”与“ Ymd”不同,请针对具体问题量身定制答案。
Yevgeniy Afanasyev

1
date(“ MM-dd-yyyy”)将日期输出为:NovNov-0202-15151515。我希望它应该是:date(“ Mdy”),它输出一个可读的日期,例如:Nov-02-15
shasi kanth

“ MM-dd-yyyy”来自这个问题。如果您不确定这意味着什么,请在对该问题的评论中提出。感谢您修改答案。
Yevgeniy Afanasyev

9

这个怎么样?

$first_day_of_week = date('m-d-Y', strtotime('Last Monday', time()));
$last_day_of_week = date('m-d-Y', strtotime('Next Sunday', time()));

8
星期一的最后一个星期一会给您上一个星期一。
Ikke

8

这就是我要从任何日期获取一周的第一天和最后一天的方法。在这种情况下,星期一是一周的第一天...

$date = date('Y-m-d') // you can put any date you want
$nbDay = date('N', strtotime($date));
$monday = new DateTime($date);
$sunday = new DateTime($date);
$monday->modify('-'.($nbDay-1).' days');
$sunday->modify('+'.(7-$nbDay).' days');

1
那才是真正的答案!
曼努埃尔·

1
奇迹般有效!
西甲联赛

6

在这里,我将星期日视为一周的第一天,将星期六视为一周的最后一天。

$m = strtotime('06-08-2012');  
$today =   date('l', $m);  
$custom_date = strtotime( date('d-m-Y', $m) );   
if ($today == 'Sunday') {  
   $week_start = date("d-m-Y", $m);  
} else {  
  $week_start = date('d-m-Y', strtotime('this week last sunday', $custom_date));  
}  

if ($today == 'Saturday') {  
  $week_end = date("d-m-Y", $m);
} else {  
  $week_end = date('d-m-Y', strtotime('this week next saturday', $custom_date));  
}
echo '<br>Start: '. $week_start;  
echo '<br>End: '. $week_end;  

输出:

开始时间:2012年5月8日
结束时间 :2012年11月8日


5

这个怎么样?

$day_of_week = date('N', strtotime($string_date));
$week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
$week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));

4

试试这个:

function week_start_date($wk_num, $yr, $first = 1, $format = 'F d, Y')
{
    $wk_ts  = strtotime('+' . $wk_num . ' weeks', strtotime($yr . '0101'));
    $mon_ts = strtotime('-' . date('w', $wk_ts) + $first . ' days', $wk_ts);
    return date($format, $mon_ts);
}

$sStartDate = week_start_date($week_number, $year);
$sEndDate   = date('F d, Y', strtotime('+6 days', strtotime($sStartDate)));

(来自此论坛主题


如何获得所有的星期数和年份?我有MM-dd-yyyy格式的字符串日期
Iggy Ma

4

这是我发现的最短,最易读的解决方案:

    <?php
    $weekstart = strtotime('monday this week');
    $weekstop = strtotime('sunday this week 23:59:59');
    //echo date('d.m.Y H:i:s', $weekstart) .' - '. date('d.m.Y H:i:s', $weekstop);
    ?>

strtotime比快new DateTime()->getTimestamp()


这很完美,请参阅我针对澳大利亚/英国日期的解决方法
zanderwar

4

只需使用 date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));


2

给定PHP版本5.3之前的版本,以下函数为您提供给定日期的一周的第一天(在这种情况下-2013年2月3日,星期日):

<?php
  function startOfWeek($aDate){
    $d=strtotime($aDate);
    return strtotime(date('Y-m-d',$d).' - '.date("w",$d).' days');
  }

  echo(date('Y-m-d',startOfWeek("2013-02-07")).'
');
?>

2
$today_day = date('D'); //Or add your own date
$start_of_week = date('Ymd');
$end_of_week = date('Ymd');

if($today_day != "Mon")
    $start_of_week = date('Ymd', strtotime("last monday"));

if($today_day != "Sun")
                    $end_of_week = date('Ymd', strtotime("next sunday"));

2
$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));

您必须先获得下一个星期一,然后才能获得下一个星期一的“最后一个星期一”。因此,如果给定的日期是星期一,它将返回与上周星期一相同的日期。


2

如果要将星期一作为一周的开始,请执行以下操作:

$date = '2015-10-12';
$day = date('N', strtotime($date));
$week_start = date('Y-m-d', strtotime('-'.($day-1).' days', strtotime($date)));
$week_end = date('Y-m-d', strtotime('+'.(7-$day).' days', strtotime($date)));

是什么让这个最好这个答案,还是这个答案?在我看来,在其他30个答案中,还有足够多的选择...
Mogsdad

谢谢。这是一个简单的解决方案,它就像一个魅力。
奥列格·波波夫

2

一种聪明的方法是让PHP处理时区差异和夏令时(DST)。让我告诉你如何做。

此函数将生成从星期一到星期五的所有日子(包括首尾两天在内)(方便于生成工作日):

class DateTimeUtilities {
    public static function getPeriodFromMondayUntilFriday($offset = 'now') {
        $now = new \DateTimeImmutable($offset, new \DateTimeZone('UTC'));
        $today = $now->setTime(0, 0, 1);

        $daysFromMonday = $today->format('N') - 1;

        $monday = $today->sub(new \DateInterval(sprintf('P%dD', $daysFromMonday)));
        $saturday = $monday->add(new \DateInterval('P5D'));

        return new \DatePeriod($monday, new \DateInterval('P1D'), $saturday);
    }
}

foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday() as $day) {
    print $day->format('c');
    print PHP_EOL;
}

这将返回本周星期一至星期五的日期时间。要对任意日期执行相同操作,请将date作为参数传递给DateTimeUtilities ::getPeriodFromMondayUntilFriday,这样:

foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00') as $day) {
    print $day->format('c');
    print PHP_EOL;
}

//prints 
//2017-01-02T00:00:01+00:00
//2017-01-03T00:00:01+00:00
//2017-01-04T00:00:01+00:00
//2017-01-05T00:00:01+00:00
//2017-01-06T00:00:01+00:00

如OP所问,仅对星期一感兴趣?

$monday = DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00')->getStartDate()->format('c');
print $monday;
// prints
//2017-01-02T00:00:01+00:00


1
<?php
/* PHP 5.3.0 */

date_default_timezone_set('America/Denver'); //Set apprpriate timezone
$start_date = strtotime('2009-12-15'); //Set start date

//Today's date if $start_date is a Sunday, otherwise date of previous Sunday
$today_or_previous_sunday = mktime(0, 0, 0, date('m', $start_date), date('d', $start_date), date('Y', $start_date)) - ((date("w", $start_date) ==0) ? 0 : (86400 * date("w", $start_date)));

//prints 12-13-2009 (month-day-year)
echo date('m-d-Y', $today_or_previous_sunday);

?>

(注意:Question中的MM,dd和yyyy不是标准的php日期格式语法-我不确定这是什么意思,因此我将$ start_date设置为ISO year-month-day)


1

另一种方法...

$year = '2014';
$month = '02';
$day = '26';

$date = DateTime::createFromFormat('Y-m-d H:i:s', $year . '-' . $month . '-' . $day . '00:00:00');
$day = date('w', $date->getTimestamp());

// 0=Sunday 6=Saturday
if($day!=0){

   $newdate = $date->getTimestamp() - $day * 86400;  //86400 seconds in a day

   // Look for DST change 
   if($old = date('I', $date->getTimestamp()) != $new = date('I', $newdate)){
       if($old == 0){
           $newdate -= 3600;  //3600 seconds in an hour
       } else {
           $newdate += 3600;
       }
   }

   $date->setTimestamp($newdate);
}

echo $date->format('D Y-m-d H:i:s');

1

获取本周第一天(星期一)的最简单方法是:

strtotime("next Monday") - 604800;

其中604800-是1周内的秒数(60 * 60 * 24 * 7)。

此代码在下周一获取,并减少1周。该代码在一周中的任何一天都可以正常运行。即使今天是星期一。


1

鉴于我所在的时区是澳大利亚人,而且我觉得这很令人沮丧 strtotime()讨厌英国日期。

如果当前日期是星期日,strtotime("monday this week")则将在第二天返回。

为了克服这个问题:

注意:这仅适用于澳大利亚/英国日期

$startOfWeek = (date('l') == 'Monday') ? date('d/m/Y 00:00') : date('d/m/Y', strtotime("last monday 00:00"));
$endOfWeek = (date('l') == 'Sunday') ? date('d/m/Y 23:59:59') : date('d/m/Y', strtotime("sunday 23:59:59"));

2
这也适用于美国日期。我已经在纽约时区进行了测试。
Jayesh D

只要星期日不是您一周的第一天(澳大利亚/英国的星期一),就可以了。
zanderwar '16

1

这是上周第一天和上周最后一天的班轮DateTime

$firstDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 7))
                             ->setTime(0, 0, 0);
$lastDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 1))
                            ->setTime(23, 59, 59);

1
$string_date = '2019-07-31';
echo $day_of_week = date('N', strtotime($string_date));
echo $week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
echo $week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));

当我们将星期一作为一周的第一天(星期一至星期日)时,此选项很有用。
卡姆兰·穆斯塔克

0

我已经多次遇到这个问题,并且总是惊讶于日期函数不能使这个变得更容易或更清楚。这是我使用DateTime类的PHP5解决方案:

/**
 * @param DateTime $date A given date
 * @param int $firstDay 0-6, Sun-Sat respectively
 * @return DateTime
 */
function getFirstDayOfWeek(DateTime $date, $firstDay = 0) {
    $offset = 7 - $firstDay;
    $ret = clone $date;
    $ret->modify(-(($date->format('w') + $offset) % 7) . 'days');
    return $ret;
}

必须进行克隆以避免更改原始日期。


0

关于什么:

$date = "2013-03-18"; 
$searchRow = date("d.m.Y", strtotime('last monday',strtotime($date." + 1 day")));
echo "for date " .$date ." we get this monday: " ;echo $searchRow; echo '<br>';

它不是最好的方法,但我进行了测试,如果我在本周中,我会得到正确的星期一,如果我在星期一中,我将得到那个星期一。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.