给定日期MM-dd-yyyy
格式,有人可以帮助我获得一周的第一天吗?
答案 0 :(得分:130)
这是我正在使用的......
$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 :(得分:59)
strtotime('this week', time());
替换时间()。当前一天是星期日/星期一,下周日/最后一个星期一方法将无效。
答案 2 :(得分:53)
使用strtotime
function非常简单:
echo date("Y-m-d", strtotime('monday this week')), "\n";
echo date("Y-m-d", strtotime('sunday this week')), "\n";
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它有点across PHP versions:
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
答案 3 :(得分:41)
保持简单:
<?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');
?>
来源:PHP manual
答案 4 :(得分:25)
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));
这会为您提供给定日期本周的某一天0
=星期日和6
=星期六。从那里你可以简单地向后计算到你想要的那一天。
答案 5 :(得分: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'));
输出: -
string '06-10-2013' (length=10)
这将涉及年份界限和闰年。
答案 6 :(得分:16)
编辑:以下链接不再在PHP声明的版本上运行。它运行在PHP 5.6上,提高了strtotime的可靠性,但并不完美!表格中的结果是PHP 5.6的实时结果。
对于它的价值,这里是确定一致参考框架时strtotime的不稳定行为的细分:
http://gamereplays.org/reference/strtotime.php
基本上只有这些字符串能够可靠地给你相同的日期,无论你打电话给他们当天的哪一天:
strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday");
答案 7 :(得分: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
答案 8 :(得分:10)
假设星期一是一周的第一天,这有效:
echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));
答案 9 :(得分:8)
这个怎么样?
$first_day_of_week = date('m-d-Y', strtotime('Last Monday', time()));
$last_day_of_week = date('m-d-Y', strtotime('Next Sunday', time()));
答案 10 :(得分:6)
在这里,我将周日视为第一个&amp;星期六作为一周的最后一天。
$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;
输出:
开始时间:05-08-2012
结束:11-08-2012
答案 11 :(得分: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');
答案 12 :(得分:4)
这个怎么样?
$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"));
答案 13 :(得分:4)
只需使用date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));
答案 14 :(得分:3)
这是我发现的最短且最易读的解决方案:
<?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()
快。
答案 15 :(得分:3)
试试这个:
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)));
答案 16 :(得分:2)
$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));
你必须先获得下一个星期一然后获得下周一的“最后一个星期一”。因此,如果给定的日期是星期一,它将返回相同的日期,而不是星期一的星期一。
答案 17 :(得分: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)));
答案 18 :(得分: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;
}
这将返回当周周一至周五的日期时间。要对任意日期执行相同操作,请将日期作为参数传递给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
答案 19 :(得分: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"));
答案 20 :(得分:2)
鉴于PHP版本5.3之前的函数给出了给定日期的一周中的第一天(在本例中为2013-02-03周日):
<?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")).'
');
?>
答案 21 :(得分: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"));
答案 22 :(得分:1)
您使用strptime()
解析日期,并在结果中使用date()
:
date('N', strptime('%m-%d-%g', $dateString));
答案 23 :(得分: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);
答案 24 :(得分: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"));
答案 25 :(得分:1)
获得当周第一天(星期一)的最简单方法是:
strtotime("next Monday") - 604800;
其中604800 - 是1周内的秒数(60 * 60 * 24 * 7)。
此代码将于下周一发布,并将其减少1周。此代码适用于一周中的任何一天。即使今天是星期一。
答案 26 :(得分: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');
答案 27 :(得分: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);
?>
(注意:问题中的MM,dd和yyyy不是标准的php日期格式语法 - 我不能确定是什么意思,所以我将$ start_date设置为ISO year-month-day)< / em>的
答案 28 :(得分:0)
我用它:
$firstDate = date( 'Y-m-d', strtotime( 'Last Monday', strtotime('-1 week') ));
$lastDate = date( 'Y-m-d', strtotime( 'First Sunday', strtotime('-1 week') ));
希望这对你有帮助!
答案 29 :(得分:0)
我正在寻找类似于此的解决方案,最后我想出了一些将在本周每天返回的内容。
//set current timestamp
$today = time();
//calculate the number of days since Monday
$dow = date('w', $today);
$offset = $dow - 1;
if ($offset < 0) {
$offset = 6;
}
//calculate timestamp for Monday and Sunday
$monday = $today - ($offset * 86400);
$tuesday = $monday + (1 * 86400);
$wednesday = $monday + (2 * 86400);
$thursday = $monday + (3 * 86400);
$friday = $monday + (4 * 86400);
$saturday = $monday + (5 * 86400);
$sunday = $monday + (6 * 86400);
//print dates for Monday and Sunday in the current week
print date("Y-m-d", $monday) . "\n";
print date("Y-m-d", $tuesday) . "\n";
print date("Y-m-d", $wednesday) . "\n";
print date("Y-m-d", $thursday) . "\n";
print date("Y-m-d", $friday) . "\n";
print date("Y-m-d", $saturday) . "\n";
print date("Y-m-d", $sunday) . "\n";
感谢dbunic在此发布此内容:http://www.redips.net/php/week-list-current-date/#comments
答案 30 :(得分:0)
这个为今天做好准备是星期一
function lastMonday(\DateTime $date) {
$timestamp = $date->getTimestamp();
$monday = ( 1 == date( 'N', $timestamp ));
if ($monday) {
return $timestamp;
} else {
return strtotime( 'last monday', $timestamp );
}
}
如果你想让它获得时间戳而不是DateTime改变前两行 (摆脱date-&gt; getTimestamp) 把它们改成这个
function lastMonday($timestamp) {
如果你想让它输入字符串改变前两行到这个
function lastMonday($dateString) {
$timestamp = strtotime($dateString);
答案 31 :(得分:0)
我发现此解决方案很有帮助。如果不是星期一就可以减去前一个星期一。我使用$ lower_date作为我从查询中提取的日期,然后我需要协调到上周一。
//set this up to go backwards until you find monday
while(date('D',strtotime($lower_date))!='Mon'){
$lower_date = date('Y-m-d', strtotime($lower_date . ' - 1 day')); //increase the upper spec
}
答案 32 :(得分:0)
您也可以使用碳库
$dateString = '02-21-2015'; // example in format MM-dd-yyyy
$date = Carbon::createFromFormat('m-d-Y', $dateString);
$date->hour(0)->minute(0)->second(0)->startOfWeek();
$dateString = $date->Format('m-d-Y'); // and you have got a string value "02-16-2015"
答案 33 :(得分: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>';
这不是最好的方式,但我测试了,如果我在本周我得到了正确的星期一,如果我在星期一,我会得到那个星期一。
答案 34 :(得分:0)
应该工作:
/**
* Returns start of most recent Sunday.
*
* @param null|int $timestamp
* @return int
*/
public static function StartOfWeek($timestamp = null) {
if($timestamp === null) $timestamp = time();
$dow = idate('w', $timestamp); // Sunday = 0, Monday = 1, etc.
return mktime(0, 0, 0, idate('m', $timestamp), idate('d', $timestamp) - $dow, idate('Y', $timestamp));
}
输入和输出是unix时间戳。使用date
进行格式化。
答案 35 :(得分: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;
}
需要克隆以避免更改原始日期。
答案 36 :(得分:0)
为了获得最简单的代码并从星期一开始有几个星期,我使用了此方法:
$day = (date('w')+6)%7; //transform week start from sunday to monday
$time = strtotime('-'.$day.' days');
答案 37 :(得分:0)
仅是单行答案;)
$mondayThisWeek = new Date($date . 'this week monday');