Given a date MM-dd-yyyy format, can someone help me get the first day of the week?
-
4What do you mean by first day of the week? Do you mean Sun, Mon? Or do you mean the date of the first day of the week? – Jeffrey Hines Dec 13 '09 at 21:04
-
2The first day of the week is constant: it's Monday (or possibly Sunday). Do you mean you want to get the date of the Monday preceding a given arbitrary date? – Jon Cram Dec 13 '09 at 21:08
-
What version of PHP - 4 or 5? – Jon Cram Dec 13 '09 at 21:10
-
the date of the sunday of the week. php 5 – Iggy Ma Dec 13 '09 at 21:15
-
1Strange, he asking for a `DateTime` solution and most of the answers does not provide it. =) – lin Nov 15 '16 at 09:38
-
I am surprised everyone is so off. Here is the right answer: https://stackoverflow.com/a/65646763/560972 – Andrew Jan 09 '21 at 19:29
38 Answers
Here is what I am using...
$day = date('w');
$week_start = date('m-d-Y', strtotime('-'.$day.' days'));
$week_end = date('m-d-Y', strtotime('+'.(6-$day).' days'));
$day contains a number from 0 to 6 representing the day of the week (Sunday = 0, Monday = 1, etc.).
$week_start contains the date for Sunday of the current week as mm-dd-yyyy.
$week_end contains the date for the Saturday of the current week as mm-dd-yyyy.
- 1,923
- 1
- 14
- 20
-
1
-
what if the week number is given? and i want it returns the start and the end date of that week. – Oki Erie Rinaldi Aug 07 '15 at 07:00
-
1@OkiErieRinaldi You should probably open a new question in order to receive the proper attention. – JadedCore Aug 11 '15 at 12:39
-
-
I'm not sure why the other one is higher. It doesn't work, but this one does! https://3v4l.org/q6kKY – Jason Mar 23 '16 at 23:30
-
I think this answer needs to pass the first `date` function and the `strtotime`function the timestamp of the given date **MM-dd-yyyy**. Otherwise this would just compute the Monday of the current week. – Adam Sep 20 '17 at 10:02
-
If you want to figure this out for an arbitrary date that you can pass in (`$date`), you can do it like `$time = strtotime($date); $day = date('w', $time); $first_of_week = date('m-d-Y', strtotime('-'.$day.' days', $time));` – WOUNDEDStevenJones Jun 18 '18 at 22:33
-
in this case week is in US format (Sun is start), for Europeans needs to be converted: $day = !$day ? 6 : --$day; – 8ctopus Jul 15 '20 at 11:13
-
The following gives Monday for a given date: date('Y-m-d', strtotime('-'.(date('w', strtotime($date)) - 1).' days', strtotime($date))) – Envayo Oct 08 '20 at 10:45
-
Very simple to use strtotime function:
echo date("Y-m-d", strtotime('monday this week')), "\n";
echo date("Y-m-d", strtotime('sunday this week')), "\n";
It differs a bit across PHP versions:
Output for 5.3.0 - 5.6.6, php7@20140507 - 20150301, hhvm-3.3.1 - 3.5.1
2015-03-16
2015-03-22
Output for 4.3.5 - 5.2.17
2015-03-23
2015-03-22
Output for 4.3.0 - 4.3.4
2015-03-30
2015-03-29
Comparing at Edge-Cases
Relative descriptions like this week have their own context. The following shows the output for this week monday and sunday when it's a monday or a sunday:
$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 it differs a bit across PHP versions:
Output for 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
Output for 4.3.5 - 5.0.5, 5.2.0 - 5.2.17
2015-03-16
2015-03-22
2015-03-23
2015-03-22
Output for 5.1.0 - 5.1.6
2015-03-23
2015-03-22
2015-03-23
2015-03-29
Output for 4.3.0 - 4.3.4
2015-03-23
2015-03-29
2015-03-30
2015-03-29
- 184,866
- 48
- 414
- 792
- 6,531
- 2
- 27
- 28
-
-
1Thanks for this, i just modified this code so i can pass an optional date parameter $dt = $custom_date ? strtotime($custom_date) : time(); $monday = date("Y-m-d", strtotime('monday this week', $dt)); $sunday = date("Y-m-d", strtotime('sunday this week', $dt)); – Ron Michael Aug 04 '19 at 02:55
strtotime('this week', time());
Replace time(). Next sunday/last monday methods won't work when the current day is sunday/monday.
- 1,075
- 8
- 6
-
58
-
`this week` does not work if you need to have always previous start of week, but @LewisBuckley’s comment does it. – Smar Dec 10 '13 at 14:11
-
-
did not work for me, I had to se slightly different syntax for YTD, MTD, WTD. – Ron Apr 08 '14 at 00:14
-
7This answer produces inconsistent results, depending on the PHP version used: http://3v4l.org/Z3k4E @LewisBuckley's solution is consistent for all versions: http://3v4l.org/Eeh9c – Chris Baker Jun 25 '14 at 14:45
-
@LewisBuckley's answer works great but it can be combined into a single strtotime: `strtotime('last Monday tomorrow', $intTimestamp)` – Eugene C May 07 '15 at 20:00
Keep it simple :
<?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');
?>
Source : PHP manual
NB: as some user commented the $dateTime value will be modified.
- 794
- 6
- 7
-
edit: typo or some unknown syntax ? where does the \ come from ? `$dateTime = new \DateTime('2012-05-14');` – Sliq May 14 '12 at 13:56
-
2I'm doing this avoid any conflict with a possible autoloaded object of your application. That's like absolute path or relative path. – job3dot5 May 14 '12 at 14:53
-
9@Panique - the "unknown syntax" is PHP 5.3's Namespace syntax. Namespacing allows you to prefix a class with a namespace followed by a backslash. Here he's using it without a namespace in order to specify the core `DateTime` class, which means the code will work even if you have another class called `DateTime` in the current namespace. – Spudley May 14 '12 at 18:41
-
-
Cheers, best answer. Mostly because the autor is asking for a `DateTime`solution while the most answers does not provide a `DateTime` solution. – lin Nov 15 '16 at 09:36
-
As the author looking for a DateTime solution, this should be the best answer ! – GuiPab Jan 30 '19 at 20:26
-
2Clone part is not working correctly. You should clone first then make operation on clone if you need original one. – Farid Movsumov Sep 09 '19 at 13:48
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));
This gives you the day of the week of the given date itself where 0 = Sunday and 6 = Saturday. From there you can simply calculate backwards to the day you want.
- 47,132
- 31
- 107
- 135
- 425
- 3
- 3
-
6This answer returns whether a given date is sunday or monday etc. But, the questioner has asked for the date of the sunday of the week of the given date as mentioned in his comment on the original question. – Rakib Aug 26 '12 at 16:40
This question needs a good DateTime answer:-
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'));
Output:-
string '06-10-2013' (length=10)
This will deal with year boundaries and leap years.
- 17,726
- 9
- 57
- 75
EDIT: the below link is no longer running on the version of PHP stated. It is running on PHP 5.6 which improves the reliability of strtotime, but isn't perfect! The results in the table are live results from PHP 5.6.
For what it's worth, here is a breakdown of the wonky behavior of strtotime when determining a consistent frame of reference:
http://gamereplays.org/reference/strtotime.php
Basically only these strings will reliably give you the same date, no matter what day of the week you're currently on when you call them:
strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday");
- 6,754
- 5
- 38
- 65
-
The article also gave some specific code to use: $start_of_week = strtotime("next monday - 1 week"); // Will return Monday of the current week starting at 00:00:00" $end_of_week = strtotime("next monday - 1 second"); // Will return Sunday of the current week ending at 23:59:59" – Scott M. Stolz Apr 20 '19 at 13:18
Assuming Monday as the first day of the week, this works:
echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));
- 6,815
- 24
- 106
- 156
-
1"MM-dd-yyyy" is not the same as "Y-m-d", please tailor your answer to the specifics of the question. – Yevgeniy Afanasyev Nov 06 '15 at 04:12
-
1date("MM-dd-yyyy") outputs the date as: NovNov-0202-15151515. I hope it should be: date("M-d-y") which outputs a readable date like: Nov-02-15 – shasi kanth Nov 06 '15 at 07:38
-
"MM-dd-yyyy" comes from the question. If you not sure what it means - ask it in a comment to the question. Thank you for modifying your answer. – Yevgeniy Afanasyev Nov 09 '15 at 01:35
The following code should work with any custom date, just uses the desired date format.
$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;
I tested the code with PHP 5.2.17 Results:
Start: 30-07-2012
End: 05-08-2012
- 135
- 1
- 3
-
1Worth noting that this will always return the previous Monday, so if $custom_date is a Monday, it will return the date of Monday one week earlier. – Hill79 Feb 05 '13 at 14:08
-
2Does not work properly, today is sunday, results are: Start: 09-09-2013 End: 22-09-2013 – user2019515 Sep 15 '13 at 21:49
How about this?
$first_day_of_week = date('m-d-Y', strtotime('Last Monday', time()));
$last_day_of_week = date('m-d-Y', strtotime('Next Sunday', time()));
- 624
- 1
- 6
- 13
This is what I am using to get the first and last day of the week from any date. In this case, monday is the first day of the week...
$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');
- 476
- 7
- 21
Here I am considering Sunday as first & Saturday as last day of the week.
$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;
Output :
Start: 05-08-2012
End: 11-08-2012
- 61
- 1
- 1
Just use date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));
- 25,381
- 37
- 106
- 126
- 144
- 1
- 6
How about this?
$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"));
- 51
- 1
- 2
Try this:
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)));
(from this forum thread)
- 47,132
- 31
- 107
- 135
-
how do I get the week number and year in all that? I have a string date in MM-dd-yyyy format – Iggy Ma Dec 13 '09 at 21:08
This is the shortest and most readable solution I found:
<?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 is faster than new DateTime()->getTimestamp().
- 414
- 3
- 5
$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));
You have to get next monday first then get the 'last monday' of next monday. So if the given date is monday it will return the same date not last week monday.
- 389
- 4
- 11
$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"));
- 31
- 2
-
Useful when we have Monday as the first day of the week (Mon-Sun). – Kamran Mushtaq Aug 05 '19 at 11:08
Given PHP version pre 5.3 following function gives you a first day of the week of given date (in this case - Sunday, 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")).'
');
?>
- 4,472
- 1
- 20
- 26
$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,938
- 5
- 34
- 48
If you want Monday as the start of your week, do this:
$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)));
- 591
- 5
- 10
-
What makes this preferable to [this answer](http://stackoverflow.com/a/31525270/1677912), or [this answer](http://stackoverflow.com/a/27420417/1677912)? Seems to me there are more than enough options in the 30 other answers... – Mogsdad Aug 14 '15 at 01:10
-
A smart way of doing this is to let PHP handle timezone differences and Daylight Savings Time (DST). Let me show you how to do this.
This function will generate all days from Monday until Friday, inclusive (handy for generating work week days):
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;
}
This will return datetimes Monday-Friday for current week. To do the same for an arbitrary date, pass a date as a parameter to DateTimeUtilities ::getPeriodFromMondayUntilFriday, thus:
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
Only interested in Monday, as the OP asked?
$monday = DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00')->getStartDate()->format('c');
print $monday;
// prints
//2017-01-02T00:00:01+00:00
- 4,343
- 2
- 32
- 47
I've come against this question a few times and always surprised the date functions don't make this easier or clearer. Here's my solution for PHP5 that uses the DateTime class:
/**
* @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;
}
Necessary to clone to avoid altering the original date.
- 1,239
- 1
- 11
- 20
You parse the date using strptime() and use date() on the result:
date('N', strptime('%m-%d-%g', $dateString));
- 71,140
- 18
- 117
- 149
<?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);
?>
(Note: MM, dd and yyyy in the Question are not standard php date format syntax - I can't be sure what is meant, so I set the $start_date with ISO year-month-day)
- 11,958
- 2
- 31
- 37
Another way to do it....
$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');
- 162
- 1
- 5
The easiest way to get first day(Monday) of current week is:
strtotime("next Monday") - 604800;
where 604800 - is count of seconds in 1 week(60*60*24*7).
This code get next Monday and decrease it for 1 week. This code will work well in any day of week. Even if today is Monday.
- 191
- 2
- 5
I found this quite frustrating given that my timezone is Australian and that strtotime() hates UK dates.
If the current day is a Sunday, then strtotime("monday this week") will return the day after.
To overcome this:
Caution: This is only valid for Australian/UK dates
$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,483
- 1
- 19
- 42
-
2This works for USA dates also. I have tested this with Newyork timezone. – Jayesh Dhudashia Mar 01 '16 at 13:54
-
As long as Sunday ain't your first day of the week (Monday in Australia/UK) then it will be fine. – zanderwar Mar 01 '16 at 23:08
Here's a one liner for the first day of last week, and the last day of last week as a DateTime object.
$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);
- 2,000
- 21
- 23
What about:
$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>';
Its not the best way but i tested and if i am in this week i get the correct monday, and if i am on a monday i will get that monday.
- 1,067
- 1
- 12
- 15
I found this solution helpful. Just subtract if it isn't monday to get the previous Monday. I am using $lower_date as the date I pulled from a query that I then need to reconcile to the previous Monday.
//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
}
- 369
- 2
- 4
- 17
this one is prepared for today is monday
function lastMonday(\DateTime $date) {
$timestamp = $date->getTimestamp();
$monday = ( 1 == date( 'N', $timestamp ));
if ($monday) {
return $timestamp;
} else {
return strtotime( 'last monday', $timestamp );
}
}
if you want it to get timestamp instead of DateTime change first two lines (get rid of date->getTimestamp) change them to just this
function lastMonday($timestamp) {
and if you want it to input string change first two lines to this
function lastMonday($dateString) {
$timestamp = strtotime($dateString);
- 1,960
- 1
- 18
- 27
I was searching for a solution similar to this and I finally came up with something that will return each day of the current week.
//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";
Thank you to dbunic who posted this here: http://www.redips.net/php/week-list-current-date/#comments
- 3,793
- 5
- 35
- 62
I use it:
$firstDate = date( 'Y-m-d', strtotime( 'Last Monday', strtotime('-1 week') ));
$lastDate = date( 'Y-m-d', strtotime( 'First Sunday', strtotime('-1 week') ));
Hope this help you!
- 417
- 3
- 12
- 2,187
- 2
- 13
- 8
You can use Carbon library as well
$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"
- 32,743
- 20
- 155
- 172
Should work:
/**
* 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));
}
Input and output are unix timestamps. Use date to format.
- 256,080
- 255
- 805
- 1,172
In order to have the simplest code and have weeks starting on monday, I used this method:
$day = (date('w')+6)%7; //transform week start from sunday to monday
$time = strtotime('-'.$day.' days');
- 21
- 4
just simply oneline answer ;)
$mondayThisWeek = new Date($date . 'this week monday');
- 104
- 1
- 7