用PHP获取一周的第一天?

Igg*_* Ma 117 php datetime

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

Jad*_*ore 137

这是我正在使用的......

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

$ day包含0到6之间的数字,表示星期几(星期日= 0,星期一= 1等).
$ week_start包含当前星期日的日期为mm-dd-yyyy.
$ week_end包含当前星期六的日期为mm-dd-yyyy.


小智 63

strtotime('this week', time());
Run Code Online (Sandbox Code Playgroud)

替换时间().当前一天是星期日/星期一,下周日/最后一个星期一方法将无效.

  • `$ monday = strtotime('last monday',strtotime('tomorrow'));` (53认同)
  • 这个答案会产生不一致的结果,具体取决于所使用的PHP版本:http://3v4l.org/Z3k4E @ LewisBuckley的解决方案对所有版本都是一致的:http://3v4l.org/Eeh9c (5认同)

Raj*_*lam 58

使用方法很简单strtotime函数:

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

echo date("Y-m-d", strtotime('sunday this week')), "\n";
Run Code Online (Sandbox Code Playgroud)

它与PHP版本有所不同:

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

2015-03-16
2015-03-22
Run Code Online (Sandbox Code Playgroud)

输出为4.3.5 - 5.2.17

2015-03-23
2015-03-22
Run Code Online (Sandbox Code Playgroud)

输出为4.3.0 - 4.3.4

2015-03-30
2015-03-29
Run Code Online (Sandbox Code Playgroud)

Edge-Cases比较

本周的相关描述有自己的背景.下面显示的输出,本周周一,当它是一个星期一或星期天星期天:

$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";
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

输出为4.3.5 - 5.0.5,5.2.0 - 5.2.17

2015-03-16
2015-03-22
2015-03-23
2015-03-22
Run Code Online (Sandbox Code Playgroud)

输出为5.1.0 - 5.1.6

2015-03-23
2015-03-22
2015-03-23
2015-03-29
Run Code Online (Sandbox Code Playgroud)

输出为4.3.0 - 4.3.4

2015-03-23
2015-03-29
2015-03-30
2015-03-29
Run Code Online (Sandbox Code Playgroud)


job*_*ot5 42

把事情简单化 :

<?php    
$dateTime = new \DateTime('2012-05-14');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');    
?>
Run Code Online (Sandbox Code Playgroud)

资料来源:PHP手册

  • @Panique - "未知语法"是PHP 5.3的命名空间语法.Namespacing允许您使用命名空间后跟反斜杠为类添加前缀.在这里,他使用它而没有命名空间来指定核心`DateTime`类,这意味着即使你在当前命名空间中有另一个名为`DateTime`的类,代码也能工作. (9认同)
  • 我这样做是为了避免与应用程序的可能自动加载对象发生任何冲突.这就像绝对路径或相对路径. (2认同)
  • 克隆部分无法正常工作。如果需要原始的,应该先克隆,然后再对克隆进行操作。 (2认同)

小智 25

$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));
Run Code Online (Sandbox Code Playgroud)

这将为您提供给定日期本周的某一天,其中0= Sunday和6= Saturday.从那里你可以简单地向后计算你想要的那一天.

  • 这个答案将返回给定日期是星期日还是星期一等.但是,提问者已经询问了他对原始问题的评论中提到的给定日期的星期日的日期. (6认同)

Agm*_*her 18

对于它的价值,这里是确定一致参考框架时strtotime的不稳定行为的细分:

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

基本上只有这些字符串能够可靠地给你相同的日期,无论你打电话给他们当天的哪一天:

strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday"); 
Run Code Online (Sandbox Code Playgroud)


vas*_*ite 17

这个问题需要一个很好的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'));
Run Code Online (Sandbox Code Playgroud)

输出: -

string '06-10-2013' (length=10)
Run Code Online (Sandbox Code Playgroud)

这将涉及年份边界和闰年.


小智 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;
Run Code Online (Sandbox Code Playgroud)

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

Start: 30-07-2012
End: 05-08-2012
Run Code Online (Sandbox Code Playgroud)

  • 不能正常工作,今天是星期天,结果是:开始:09-09-2013结束:22-09-2013 (2认同)

sha*_*nth 10

假设星期一是一周的第一天,这有效:

echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));
Run Code Online (Sandbox Code Playgroud)


bir*_*kof 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()));
Run Code Online (Sandbox Code Playgroud)

  • 星期一的星期一星期一会给你前一个星期一. (8认同)

小智 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;  
Run Code Online (Sandbox Code Playgroud)

输出:

开始于:05-08-2012
结束:11-08-2012


ThE*_*hOp 6

这是我用来从任何日期获得一周的第一天和最后一天.在这种情况下,星期一是一周的第一天......

$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');
Run Code Online (Sandbox Code Playgroud)


小智 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"));
Run Code Online (Sandbox Code Playgroud)


Kon*_*tek 5

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


Jam*_*ore 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)));
Run Code Online (Sandbox Code Playgroud)

(来自此论坛帖子