Answers:
这是我正在使用的...
$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。
strtotime('this week', time());
替换time()。当当前日期为星期日/星期一时,下一个星期日/最后一个星期一的方法将不起作用。
$monday = strtotime('last monday', strtotime('tomorrow'));
this week
如果您需要始终有上一周的开始时间,则无法正常工作,但是@LewisBuckley的评论可以做到。
time()
如果要今天指定,第二个参数是可选的。
使用strtotime
功能非常简单:
echo date("Y-m-d", strtotime('monday this week')), "\n";
echo date("Y-m-d", strtotime('sunday this week')), "\n";
跨PHP版本有所不同:
2015-03-16
2015-03-22
2015-03-23
2015-03-22
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版本之间有所不同:
2015-03-16
2015-03-22
2015-03-23
2015-03-29
2015-03-16
2015-03-22
2015-03-23
2015-03-22
2015-03-23
2015-03-22
2015-03-23
2015-03-29
2015-03-23
2015-03-29
2015-03-30
2015-03-29
把事情简单化 :
<?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');
DateTime
类,这意味着即使您DateTime
在当前命名空间中调用了另一个类,代码也可以工作。
这个问题需要一个好的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年。
编辑:下面的链接不再在所述的PHP版本上运行。它在PHP 5.6上运行,可提高strtotime的可靠性,但并不完美!表中的结果是PHP 5.6的实时结果。
值得一提的是,这是确定一致的参考框架时strtotime的怪异行为的分解:
http://gamereplays.org/reference/strtotime.php
基本上,无论您当前处于星期几,何时调用它们,只有这些字符串都能可靠地为您提供相同的日期:
strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday");
以下代码应与任何自定义日期一起使用,仅使用所需的日期格式。
$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
假设星期一为一周的第一天,则可以执行以下操作:
echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));
这就是我要从任何日期获取一周的第一天和最后一天的方法。在这种情况下,星期一是一周的第一天...
$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');
在这里,我将星期日视为一周的第一天,将星期六视为一周的最后一天。
$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日
试试这个:
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)));
(来自此论坛主题)
只需使用 date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));
如果要将星期一作为一周的开始,请执行以下操作:
$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)));
一种聪明的方法是让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
您使用解析日期,strptime()
并将其用于date()
结果:
date('N', strptime('%m-%d-%g', $dateString));
<?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)
另一种方法...
$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');
获取本周第一天(星期一)的最简单方法是:
strtotime("next Monday") - 604800;
其中604800-是1周内的秒数(60 * 60 * 24 * 7)。
此代码在下周一获取,并减少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"));
这是上周第一天和上周最后一天的班轮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);
$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"));
我已经多次遇到这个问题,并且总是惊讶于日期函数不能使这个变得更容易或更清楚。这是我使用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;
}
必须进行克隆以避免更改原始日期。