web-dev-qa-db-ja.com

今日が月曜日の場合、php strtotime "last monday"?

strtotime("last Monday")を使用します。

問題は、今日IS MONDAY、何を返しますか?先週の月曜日の日付を返しているようです。その場合、今日の日付を返すようにするにはどうすればよいですか?

35
Nathan H

その場合、今日の日付を返すようにするにはどうすればよいですか?

擬似コード:

if (today == monday)
    return today;
else
    return strtotime(...);

ところで、このトリックも機能します:

strtotime('last monday', strtotime('tomorrow'));
70
zerkms

マニュアルを読むと、あなたが何をしたいのかを正確に説明する素晴らしい例があります http://www.php.net/manual/en/datetime.formats.relative.php

strtotime('Monday this week');

Update: PHPの新しいバージョンで導入されたbugがあるようです。this weekは間違った値を返します日曜日に実行された週。ここでバグに投票できます: https://bugs.php.net/bug.php?id=6374

更新2: 2016年5月18日の時点で、これはPHP 5.6.22、PHP 7.0.7およびPHP 7.1-dev(できれば後続のリリースで修正されたままです) https://bugs.php.net/bug.php?id=63740#1463570467

121
jmlnik

今日が月曜日の場合、strtotime( "last Monday")は7日前の日付を返します。今日が月曜日かどうかを確認して、はいの場合は今日の日付を返し、そうでない場合は先週を確認してください。

これは、これを行う確実な方法です。

if (date('N', time()) == 1) return date('Y-m-d');
else return date('Y-m-d', strtotime('last Monday'));

http://us2.php.net/manual/en/function.date.php

5
Vic

前の回答 で正しく概説されているように、このトリックは機能しますが、 警告もありましたPHP 5.6.22PHP 7.0.7、およびPHP 7.1-devの前:

strtotime('last monday', strtotime('tomorrow'));

// or this one, which is shorter, but was buggy:
strtotime('Monday this week');

「Jedy-way」を好む人にとって、 DateTime class のオブジェクトを扱うには、次の解決策があります。

(new \DateTime())->modify('tomorrow')->modify('previous monday')->format('Y-m-d');

またはさらに短い表記:

\DateTime('Monday this week')

SQLで同じことを行う場合、「明日」を追加してこれらのトリックを mysql で行う必要がないため、注意してください。ソリューションの外観は次のとおりです。

SELECT DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) as last_monday;
2
Farside

遅い答えですが、この答えを投稿すると思いました(実際には別の、しかし関連する質問からのものです)。質問のシナリオを処理します。

function last_monday($date) {
    if (!is_numeric($date))
        $date = strtotime($date);
    if (date('w', $date) == 1)
        return $date;
    else
        return strtotime(
            'last monday',
             $date
        );
}

echo date('m/d/y', last_monday('8/14/2012')); // 8/13/2012 (tuesday gives us the previous monday)
echo date('m/d/y', last_monday('8/13/2012')); // 8/13/2012 (monday throws back that day)
echo date('m/d/y', last_monday('8/12/2012')); // 8/06/2012 (sunday goes to previous week)

それを試してください: http://codepad.org/rDAI4Scr

...または前週ではなく次の日(月曜日)を返す日曜日を持つバリエーションは、単に行を追加します。

 elseif (date('w', $date) == 0)
    return strtotime(
        'next monday',
         $date
    );

それを試してください: http://codepad.org/S2NhrU2Z

タイムスタンプまたは文字列を渡すと、タイムスタンプが返されます

ドキュメント

1
Chris Baker

使用目的に応じて、これが役立つ場合があります。 1秒のあいまいさは要件に合っているため、以下を使用します。

date( 'Y-m-d 23:59:59', strtotime( 'last sunday' ))

直近の月曜日の真夜中(または今日IS月曜日)の場合は今日)に取得します。

0
Johno

私のアプローチ:

date_default_timezone_set('Europe/Berlin');
function givedate($weekday, $time) {
$now = time();
$last = strtotime("$weekday this week $time");
$next = strtotime("next $weekday $time");
    if($now > $last) {
        $date = date("d.m.Y - H:i",$next);
    }
    else {
        $date = date("d.m.Y - H:i",$last);
    }
    return $date;
}

echo givedate('Wednesday', '00:52');

または毎月

    function givedate_monthly($weekday, $time) {
    $now = time();
    $last = strtotime("first $weekday of this month $time");
    $next = strtotime("first $weekday of next month $time");
        if($now > $last) {
            $date = date("d.m.Y - H:i",$next);
        }
        else {
            $date = date("d.m.Y - H:i",$last);
        }
        return $date;
}

echo givedate_monthly('Wednesday', '01:50');
0
carbonero