PHPで週の最初の日を取得しますか?


124

日付MM-dd-yyyy形式を指定すると、誰かが週の最初の日を取得するのを手伝ってくれる?


4
週の最初の日とはどういう意味ですか?あなたは太陽、月を意味しますか?それとも、週の最初の日のことですか?
ジェフリーハインズ

2
週の最初の日は一定です。月曜日(またはおそらく日曜日)です。与えられた任意の日付の前の月曜日の日付を取得したいということですか?
Jon Cram、

PHPのバージョン-4または5
Jon Cram、

週の日曜日の日付。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には、今週の日曜日の日付がmm-dd-yyyyとして含まれています。
$ week_endには、今週の土曜日の日付がmm-dd-yyyyとして含まれています。


1
しかし、それは「今週」の始まりと終わりを意味しますよね?
沖エリーリナルディ2015

週番号が指定されている場合はどうなりますか?そして、その週の開始日と終了日を返します。
沖エリーリナルディ2015

1
@OkiErieRinaldi適切な注意を受けるためには、おそらく新しい質問を開く必要があります。
JadedCore 2015

心配しないで、私は@JadedCoreを手に入れました!
沖エリーリナルディ2015

なぜ他の方が高いのかわかりません。動作しませんが、これは動作します!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()今日を指定する場合、2番目の引数はオプションです。
そうでない場合は、2014年

私にとってはうまくいきませんでした。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):time(); $ 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ます。つまり、現在の名前空間で別のクラスが呼び出されても、コードは機能します。
スパッドリー

曜日名は常に英語ですか?
Marwelln

1
クローンパーツが正しく機能していません。最初にクローンを作成し、元のクローンが必要な場合はクローンで操作を行う必要があります。
Farid Movsumov

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

編集:以下のリンクは、記載されている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で終わる現在の週の日曜日を返します
スコットM.シュトルツ

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
正しく機能しません。今日は日曜日です。結果は次のとおりです。開始:2013
22

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として出力します。私はそれがあるべき願っています:日付を読めるように日付を出力する(「MDY」):11月- 2月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
それが本当の答えです!
2015年

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


2

PHPバージョン5.3より前の場合、次の関数は、指定された日付の週の最初の日(この場合-2013年2月3日日曜日)を提供します。

<?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の答えには十分以上のオプションがあるように
思え

どうも。これは単純な解決策であり、魅力のように機能します。
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;
}

これは、今週の月曜日から金曜日の日時を返します。任意の日付について同じことを行うには、日付をパラメーターとしてに渡します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
<?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 2016

日曜日が週の最初の日(オーストラリア/イギリスの月曜日)でない限り、問題ありません。
zanderwar 2016年

1

先週の最初の日と、先週の最終日をDateTime対象とした1つのライナーがあります。

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

月曜日を週の最初の日(Mon-Sun)とする場合に役立ちます。
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.