PHP로 요일을 시작 하시겠습니까?


124

날짜 MM-dd-yyyy형식이 주어지면 누군가가 요일을 가져 오도록 도와 줄 수 있습니까?


4
요일이란 무엇을 의미합니까? Sun, Mon을 의미합니까? 아니면 요일의 날짜를 의미합니까?
Jeffrey Hines

2
첫 번째 요일은 일정합니다. 월요일 (또는 일요일)입니다. 주어진 임의의 날짜 이전의 월요일 날짜를 얻고 싶습니까?
Jon Cram

어떤 버전의 PHP-4 또는 5?
Jon Cram

요일의 날짜. php 5
Iggy Ma

이상하게도 그는 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 에는 현재주의 일요일 날짜가 mm-dd-yyyy로 포함됩니다.
$ week_end 에는 현재주의 토요일 날짜가 mm-dd-yyyy로 포함됩니다.


1
근데 '이번 주'의 시작과 끝을 의미하는 거죠?
Oki Erie Rinaldi

주 번호가 주어지면 어떻게됩니까? 그주의 시작일과 종료일을 반환하고 싶습니다.
Oki Erie Rinaldi 2015 년

1
@OkiErieRinaldi 적절한 관심을 받으려면 새 질문을 열어야합니다.
JadedCore

걱정하지 마세요, @JadedCore를 받았습니다!
Oki Erie Rinaldi

다른 하나가 왜 더 높은지 잘 모르겠습니다. 작동하지 않지만 이것은 작동합니다! 3v4l.org/q6kKY
Jason

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

time ()을 바꿉니다. 다음 일요일 / 마지막 월요일 방법은 현재 날짜가 일요일 / 월요일이면 작동하지 않습니다.


55
$monday = strtotime('last monday', strtotime('tomorrow'));
Lewis Buckley 2013

this week항상 이전 주 시작이 필요한 경우 작동하지 않지만 @LewisBuckley의 의견은 작동합니다.
Smar

time()오늘을 지정하려는 경우 두 번째 인수 는 옵션입니다.
Ifnot 2014 년

나를 위해 작동하지 않았으므로 YTD, MTD, WTD에 대해 약간 다른 구문을 선택해야했습니다.
Ron

6
이 답변은 사용 된 PHP 버전에 따라 일관되지 않은 결과를 생성합니다. 3v4l.org/Z3k4E @LewisBuckley의 솔루션은 모든 버전에서 일관됩니다. 3v4l.org/Eeh9c
Chris Baker

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

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

다시 말하지만 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 = date ( "Ymd", strtotime ( '이번 주 월요일', $ dt)); $ sunday = date ( "Ymd", strtotime ( '이번 주 일요일', $ dt));
Ron Michael

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
응용 프로그램의 가능한 자동로드 개체와의 충돌을 방지합니다. 그것은 절대 경로 또는 상대 경로와 같습니다.
job3dot5

9
@Panique- "알 수없는 구문"은 PHP 5.3의 네임 스페이스 구문입니다. 네임 스페이스를 사용하면 네임 스페이스 뒤에 백 슬래시가있는 클래스 접두사를 지정할 수 있습니다. 여기서 그는 핵심 DateTime클래스 를 지정하기 위해 네임 스페이스없이 사용하고 DateTime있습니다. 즉, 현재 네임 스페이스에서 다른 클래스를 호출하더라도 코드가 작동 합니다.
Spudley

요일 이름은 항상 영어입니까?
Marwelln

1
복제 부분이 제대로 작동하지 않습니다. 먼저 복제 한 다음 원본이 필요한 경우 복제 작업을 수행해야합니다.
Farid Movsumov

25
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));

이것은 주어진 날짜 자체의 요일을 제공합니다. 여기서 0= 일요일 및 6= 토요일. 거기에서 원하는 날짜로 거꾸로 계산할 수 있습니다.


6
이 답변은 주어진 날짜가 일요일인지 월요일인지를 반환합니다. 그러나 질문자는 원래 질문에 대한 그의 의견에서 언급 한대로 주어진 날짜의 주 일요일 날짜를 요청했습니다.
Rakib

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

편집 : 아래 링크는 명시된 PHP 버전에서 더 이상 실행되지 않습니다. strtotime의 안정성을 향상시키는 PHP 5.6에서 실행되지만 완벽하지는 않습니다! 표의 결과는 PHP 5.6의 실시간 결과입니다.

그만한 가치는 일관된 참조 프레임을 결정할 때 strtotime의 불안정한 동작에 대한 분석입니다.

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

기본적으로 호출 할 때 현재 어떤 요일에 있든 상관없이이 문자열 만 안정적으로 동일한 날짜를 제공합니다.

strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday"); 

이 기사는 또한 사용할 특정 코드를 제공했습니다. $ start_of_week = strtotime ( "next monday-1 week"); // 00:00:00에 시작하여 현재주의 월요일을 반환합니다. "$ end_of_week = strtotime ("next monday-1 second "); // 23:59:59에 끝나는 현재주의 일요일을 반환합니다."
Scott M. STOLZ

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가 월요일이면 1 주일 전에 월요일 날짜를 반환합니다.
Hill79 2013

2
제대로 작동하지 않습니다. 오늘은 일요일입니다. 결과는 다음과 같습니다. 시작 : 09-09-2013 종료 :
22-09-2013

10

월요일을주의 첫날로 가정하면 다음과 같이 작동합니다.

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

1
"MM-dd-yyyy"는 "Ymd"와 동일하지 않습니다. 질문의 세부 사항에 맞게 답변을 조정하십시오.
Yevgeniy Afanasyev 2015

1
date ( "MM-dd-yyyy")는 날짜를 NovNov-0202-15151515로 출력합니다. 다음과 같이 읽을 수있는 날짜를 출력하는 date ( "Mdy")가 되었으면합니다. Nov-02-15
shasi kanth

"MM-dd-yyyy"는 질문에서 나옵니다. 그것이 무엇을 의미하는지 잘 모르겠다면 질문에 대한 의견으로 물어보십시오. 답변을 수정 해 주셔서 감사합니다.
Yevgeniy Afanasyev 2015

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
월요일의 마지막 월요일은 이전 월요일을 제공합니다.
Ikke

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
그것이 진정한 답입니다!
Manuel

1
매력처럼 작동합니다!
Liga

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;  

출력 :

시작 : 2012
년 5 월 8 일 끝 : 2012 년 11 월 8 일


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 형식의 문자열 날짜가 있습니다
Iggy Ma

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

4

그냥 사용 date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));


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

고마워. 이것은 간단한 해결책이며 매력처럼 작동합니다.
Oleg Popov

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

이것은 이번 주 월요일-금요일 datetimes를 반환합니다. 임의의 날짜에 대해 동일한 작업을 수행하려면 날짜를 매개 변수로에 전달합니다 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

1

다음을 사용하여 날짜를 구문 분석하고 결과에 strptime()사용 date()합니다.

date('N', strptime('%m-%d-%g', $dateString));

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 날짜 형식 구문이 아닙니다. 무슨 뜻인지 확신 할 수 없으므로 ISO 년-월-일로 $ start_date를 설정했습니다)


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
이것은 미국 날짜에도 적용됩니다. 나는 이것을 Newyork 시간대로 테스트했습니다.
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"));

월요일이 요일 (월-일) 일 때 유용합니다.
Kamran Mushtaq

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

원래 날짜를 변경하지 않으려면 복제해야합니다.


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

최선의 방법은 아니지만 테스트를했고 이번 주에 있으면 올바른 월요일을 얻고, 월요일에 있으면 월요일에 올 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.