Отримати перший день тижня в PHP?


124

З огляду на MM-dd-yyyyформат побачень, чи може хтось допомогти мені отримати перший день тижня?


4
Що ви маєте на увазі під першим днем ​​тижня? Ви маєте на увазі Сонце, Пн? Або ви маєте на увазі дату першого дня тижня?
Джеффрі Хайнс

2
Перший день тижня є постійним: це понеділок (або, можливо, неділя). Ви маєте на увазі, що хочете отримати дату понеділка, що передує заданій довільній даті?
Джон Крам

Яка версія PHP - 4 або 5?
Джон Крам

дата неділі тижня. php 5
Іггі Ма

Як не дивно, він просить DateTimeрішення і більшість відповідей не забезпечує його. =)
lin

Відповіді:


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 містить дату для неділі поточного тижня як мм-дд-рр-р.
$ week_end містить дату для суботи поточного тижня як мм-дд-рр-р.


1
але це означає початок і кінець "цього тижня", правда?
Окі Ері Рінальді

що робити, якщо вказано номер тижня? і я хочу, щоб він повертав дату початку та кінця цього тижня.
Окі Ері Рінальді

1
@OkiErieRinaldi Напевно, ви повинні відкрити нове запитання, щоб отримати належну увагу.
JadedCore

Не хвилюйтесь, я отримав це @JadedCore!
Окі Ері Рінальді

Я не впевнений, чому інший вищий. Це не працює, але це робить! 3v4l.org/q6kKY
Джейсон

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

Замініть час (). Наступні методи неділі / останньої понеділка не працюватимуть, коли поточний день - неділя / понеділок.


55
$monday = strtotime('last monday', strtotime('tomorrow'));
Льюїс Баклі

this weekне працює, якщо вам потрібно мати попередній початок тижня, але коментар @ LewisBuckley це робить.
Смар

Другий аргумент time()- варіант, якщо ви хочете вказати сьогодні.
Якщо ні

не працювало для мене, мені довелося дещо інший синтаксис для YTD, MTD, WTD.
Рон

6
Ця відповідь дає непослідовні результати, залежно від використовуваної версії PHP: рішення 3v4l.org/Z3k4E @ LewisBuckley відповідає всім версіям: 3v4l.org/Eeh9c
Кріс Бейкер,

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): час (); $ monday = дата ("Ymd", strtotime ("понеділок цього тижня", $ dt)); $ sunday = дата ("Ymd", strtotime ("неділя цього тижня", $ 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
Я це роблю, щоб уникнути конфлікту з можливим автоматично завантаженим об'єктом вашої програми. Це як абсолютний шлях або відносний шлях.
робота3dot5

9
@Panique - "невідомий синтаксис" - це синтаксис простору імен PHP 5.3. Простір імен дозволяє встановити префікс класу з простором імен з подальшим зворотним нахилом. Тут він використовує його без простору імен, щоб вказати основний DateTimeклас, а це означає, що код буде працювати, навіть якщо DateTimeу поточному просторі імен ви маєте інший клас .
Спудлі

Чи завжди назва дня англійською?
Марвелл

1
Клонова частина працює неправильно. Спершу слід клонуватись, а потім зробити операцію над клоном, якщо вам потрібен оригінальний.
Фарид Мовсумов

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)

Це стосуватиметься меж року та високосних років.


18

EDIT: нижченаведене посилання більше не працює у зазначеній версії 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"
Скотт М.

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 - понеділок, він поверне дату понеділка на тиждень раніше.
Hill79

2
Не працює належним чином, сьогодні неділя, результати такі: Початок: 09.09.2013 Закінчення: 22-09-2013
користувач2019515

10

Якщо вважати понеділок першим днем ​​тижня, це працює:

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

1
"MM-dd-yyyy" - це не те саме, що "Ymd", будь ласка, підгадуйте свою відповідь під специфіку питання.
Євген Афанасьєв

1
дата ("MM-dd-yyyy") виводить дату як: NovNov-0202-1515151515. Я сподіваюся, що це має бути: дата ("Mdy"), яка видає читабельну дату, наприклад: Nov-02-15
shasi kanth

"MM-dd-yyyy" походить від питання. Якщо ви не впевнені, що це означає - задайте це в коментарі до питання. Дякуємо, що змінили вашу відповідь.
Євген Афанасьєв

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
Останній понеділок понеділка передасть вам попередній понеділок.
Іке

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;  

Вихід:

Початок: 08.08.2012
Кінець: 11-08-2012


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
Іггі Ма

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


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")).'
');
?>

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;
}

Це поверне дати в понеділок-п’ятницю для поточного тижня. Щоб зробити те ж саме для довільної дати, передайте дату як параметр 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

Цікавить лише понеділок, як просив ОП?

$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);

?>

(Примітка: MM, dd та yyyy у запитанні - це не стандартний синтаксис формату дати php - я не можу бути впевнений, що мається на увазі, тому я встановив $ start_date з ISO рік-місяць-день)


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

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

Я кілька разів зустрічався з цим питанням і завжди дивувався, що функції дати не роблять це простішим і зрозумілішим. Ось моє рішення для PHP5, який використовує DateTimeклас:

/**
 * @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>';

Це не найкращий спосіб, але я перевірений, і якщо я на цьому тижні, я отримаю правильний понеділок, і якщо я в понеділок, я отримаю цей понеділок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.