日付が週末のPHPかどうかの確認


89

この関数はfalseのみを返すようです。同じことをしている人はいますか?きっと見落としているはずなのに、新鮮な目など...

function isweekend($date){
    $date = strtotime($date);
    $date = date("l", $date);
    $date = strtolower($date);
    echo $date;
    if($date == "saturday" || $date == "sunday") {
        return "true";
    } else {
        return "false";
    }
}

以下を使用して関数を呼び出します。

$isthisaweekend = isweekend('2011-01-01');

15
あなたtrueとあなたfalseは文字列として引用されるべきではありません。また、コードは解析エラーを生成}し、if内の浮遊のためにまったく実行されないはずです。
BoltClock

回答:


210

PHP> = 5.1の場合:

function isWeekend($date) {
    return (date('N', strtotime($date)) >= 6);
}

さもないと:

function isWeekend($date) {
    $weekDay = date('w', strtotime($date));
    return ($weekDay == 0 || $weekDay == 6);
}

10
PHP <5を使用する場合、使用return date('w', strtotime($date)) % 6 == 0は少し短くなります。
ジム

23
これは同じことですが、明示的なチェックは、コードを読んでいる人にとってはより明白です。
ThiefMaster 2012年

2
次に、それがコメントの目的です。
Stephen Sabatini

13
まあ、多くのコメントがなくてもコードは読みやすいはずだと言う人がいます。優れたコードは読みやすく、必ずしも短くはありません。#CleanCode
anweibel

コードが少ないほど、テストと保守が少なくて済みます。しかし、それが読めない場合、テストと保守が難しくなります。読みやすさについて厳格な規則が必要ですか、それとも経験次第ですか?
2018年

48

もう1つの方法は、DateTimeクラスを使用する方法です。この方法では、タイムゾーンを指定することもできます。注:PHP 5.3以降。

// For the current date
function isTodayWeekend() {
    $currentDate = new DateTime("now", new DateTimeZone("Europe/Amsterdam"));
    return $currentDate->format('N') >= 6;
}

特定の日付文字列をチェックできるようにする必要がある場合は、DateTime :: createFromFormatを使用できます。

function isWeekend($date) {
    $inputDate = DateTime::createFromFormat("d-m-Y", $date, new DateTimeZone("Europe/Amsterdam"));
    return $inputDate->format('N') >= 6;
}

この方法の優れた点は、PHPでタイムゾーンをグローバルに変更せずにタイムゾーンを指定できることです。これにより、他のスクリプト(Wordpressなど)で副作用が発生する可能性があります。


1
あなたの賛成票を取ってください。しかし、私の平民は彼らが週の追加の曜日を追加することを決定したときにそれがちょうど平日であるかもしれないと警告しています:)
トリッキー

「この方法でタイムゾーンを指定することもできます」。このSO投稿によると、タイムゾーンを別の方法で指定することもできます。私はあなたの解決策を使用しました
Wouter Vanherck、2018

11

上記のPHP 5.5またはPHP 7を使用している場合は、次のものを使用できます。

function isTodayWeekend() {
    return in_array(date("l"), ["Saturday", "Sunday"]);
}

今日が週末の場合は「true」を返し、そうでない場合は「false」を返します。


これは英語のサイトでのみ機能します。変更することもできますが、複数の言語を使用するサイトでは扱いにくくなります。
Bob Ray

1
@Bob Rayああ、申し訳ありませんが、私が書いている間に気づかなかった
Harvey

9

ここに:

function isweekend($year, $month, $day)
{
    $time = mktime(0, 0, 0, $month, $day, $year);
    $weekday = date('w', $time);
    return ($weekday == 0 || $weekday == 6);
}

8

コードの作業バージョン(BoltClockによって指摘されたエラーから):

<?php
$date = '2011-01-01';
$timestamp = strtotime($date);
$weekday= date("l", $timestamp );
$normalized_weekday = strtolower($weekday);
echo $normalized_weekday ;
if (($normalized_weekday == "saturday") || ($normalized_weekday == "sunday")) {
    echo "true";
} else {
    echo "false";
}

?>

迷惑な「{」は、特に(私の場合は)まともなPHPエディタがないと、見づらくなります。だから私は修正されたバージョンをここに投稿します。


また、引用符で囲まれたtrueまたはfalseを返さないでください。条件を返します。
アレックス

@alex:結果を確認するために「エコー」を使用するので、それだけです。アドバイスありがとうございます。
ホアンロング

2

私のようなミニマルではない人のために、 " intlというPECL拡張機能があります。」ます。「idn」拡張や「IntlDateFormatter」のような他のいくつかのn1クラスよりもうまく機能するので、idn変換に使用します。

さて、私が言いたいのは、 "intl"拡張には "IntlCalendar"というクラスがあり、これは多くの国際国を処理できることです(たとえば、サウジアラビアでは、日曜日は週末ではありません)。IntlCalendarには、そのためのメソッドIntlCalendar :: isWeekendがあります。多分あなたはそれを試してみるかもしれません、私はこれらの国際クラスで「ほとんどすべての国で機能する」という事実が好きです。

編集:よくわかりませんが、PHP 5.5.0以降、intl拡張機能はPHPにバンドルされています(--enable-intl)。


0

これは私にとってはうまくいき、再利用できます。

function isThisDayAWeekend($date) {

    $timestamp = strtotime($date);

    $weekday= date("l", $timestamp );

    if ($weekday =="Saturday" OR $weekday =="Sunday") { return true; } 
    else {return false; }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.