PHPで2つの日付を比較するにはどうすればよいですか?


125

PHPで2つの日付を比較するにはどうすればよいですか?

日付は次の形式でデータベースに保存されます

2011-10-2

今日の日付をデータベースの日付と比較して、どちらが大きいかを確認したい場合、どうすればよいですか?

私はこれを試しました、

$today = date("Y-m-d");
$expire = $row->expireDate //from db

if($today < $expireDate) { //do something; }

しかし、実際にはそうはいきません。それを行う別の方法は何ですか?


データベースの日付をDateTimeオブジェクトに割り当て、それらのオブジェクトを比較します。stackoverflow.com/questions/961074/…で
Peter

回答:


80

データベースでは、日付は次のようになります2011-10-2

YYYY-MM-DDに保存すると、「1」>「0」などになるため、文字列の比較が機能します。


2
しかし、2011-10-02と2012-02-10のように見える場合、月の比較では1> 0ですが、2011-10-02 <2012-02-10
dav

14
@Davo、比較は異なる最初の文字で停止します。この場合、 '1' <'2'の4桁目なので、期待した結果が得られます。
マシュー

1
申し訳ありません:)、十分に注意していませんでした。
dav

次の作業は2016-03-27 11:59:47 ::: 2016-03-14 10:30:00
shorif2000 2016年

221

すべての日付が1970年1月1日より後の場合、次のようなものを使用できます。

$today = date("Y-m-d");
$expire = $row->expireDate; //from database

$today_time = strtotime($today);
$expire_time = strtotime($expire);

if ($expire_time < $today_time) { /* do Something */ }

PHP 5> = 5.2.0を使用している場合は、DateTimeクラスを使用できます。

$today_dt = new DateTime($today);
$expire_dt = new DateTime($expire);

if ($expire_dt < $today_dt) { /* Do something */ }

またはこれらの線に沿って何か。


私が正しく思い出すと、この懸念1st of January of 1970Windowsで実行されている古いバージョンのPHPにのみ当てはまり、Unixでは問題にはなりませんでした。
アルバロゴンサレス

私はこの答えが好きです。それは)(のstrtotimeに最適な選択肢コンバート日だ
エーリヒ・ガルシア

2
「すべての日付が1970年1月1日より後の場合」および「2038年より前」ではないでしょうか。y2k38のバグを確認してください。strtotime日付が大きい場合はfalseを返します。stackoverflow.com/questions/2012589/...
blamb

DateTimeメソッドが推奨メソッドであることに注意してください。そのオブジェクトは、これまでよりもはるかに多くのstrtotimeことができます。
Machavity

new DateTime('now')今日の日付を取得することもできます
ブリース

23

すでに与えられた答えをほめるために、次の例を参照してください:

$today = new DateTime('');
$expireDate = new DateTime($row->expireDate); //from database



if($today->format("Y-m-d") < $expireDate->format("Y-m-d")) { 
    //do something; 
}

更新: または、シンプルなold-school date()関数を使用します。

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   

1
日付は関数であり、クラス/コンストラクターではありません。
spdionis

2
@spdionisコメントをありがとう、混乱を避けるために大文字を変更しました。
d.raev 2016年

6

私はこれをPHPではしません。データベースは今日が何曜日かを知っている必要があります(たとえば、MySQL-> NOW()を使用します)。そのため、使用されている日付タイプに応じて問題なく、クエリ内で比較して結果を返すのは非常に簡単です。

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName

おかげで、私は実際にdate()を使用します。今日の日付をdbに保存しません
サーメンB.

4
しかし、expireDateをデータベースに格納します。この日付をNOW()と比較してください
Dr.Molle

4
$today = date('Y-m-d');//Y-m-d H:i:s
$expireDate = new DateTime($row->expireDate);// From db 
$date1=date_create($today);
$date2=date_create($expireDate->format('Y-m-d'));
$diff=date_diff($date1,$date2);

//echo $timeDiff;
if($diff->days >= 30){
    echo "Expired.";
}else{
    echo "Not expired.";
}

2

2つの日付を分単位で取得する方法を次に示します。

// set dates
$date_compare1= date("d-m-Y h:i:s a", strtotime($date1));
// date now
$date_compare2= date("d-m-Y h:i:s a", strtotime($date2));

// calculate the difference
$difference = strtotime($date_compare1) - strtotime($date_compare2);
$difference_in_minutes = $difference / 60;

echo $difference_in_minutes;

質問は2つの日付を比較することを求めています-あなたの答えは、質問への答えとして必要ではない余分なもの(つまり、オンライン/オフラインステータスの設定)を追加することです。比較が行われる回答の部分は、ここにある既存の回答と実質的に同じです
crazyloonybin 2017

質問を更新しました、私は間違った質問に間違った回答を投稿しました^^;)回答と同じではありません。それらを比較して分単位で違いを得る方法に関する私の入力を追加するだけです。
シノ2017

1
更新のために反対票を削除しましたが、見た目はかなり良くなりました:)
crazyloonybin 2017

2

日付をUNIXタイムスタンプに変換し、それらの差を秒単位で比較できます。

$today_date=date("Y-m-d");
$entered_date=$_POST['date'];
$dateTimestamp1 = strtotime($today_date);
$dateTimestamp2 = strtotime($entered_date);
$diff= $dateTimestamp1-$dateTimestamp2;
//echo $diff;
if ($diff<=0)
   {
     echo "Enter a valid date";
   }

0

私もその問題を抱えていたので、次の方法で解決しました。

$today = date("Ymd");
$expire = str_replace('-', '', $row->expireDate); //from db

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
}

この手法が機能する理由は、回答で説明する必要があります。
mickmackusa

独自のシナリオをどのように解決したかではなく、OPの投稿された質問に答えてください。
mickmackusa

0

PHPを使用して2つの日付間の日数の差を取得する方法についての私のスピンです。「!」の使用に注意してください DateTimeのcreateFromFormatからの情報に時間がないため、日付の時間部分を破棄する形式で。

$today = DateTime::createFromFormat('!Y-m-d', date('Y-m-d'));
$wanted = DateTime::createFromFormat('!d-m-Y', $row["WANTED_DELIVERY_DATE"]);
$diff = $today->diff($wanted);
$days = $diff->days;
if (($diff->invert) != 0) $days = -1 * $days;
$overdue = (($days < 0) ? true : false);
print "<!-- (".(($days > 0) ? '+' : '').($days).") -->\n";

-1

ブログで答えが見つかりました。次のように簡単です。

strtotime(date("Y"."-01-01")) -strtotime($newdate))/86400

そして、2つの日付の間の日数を取得します。


これは別の問題を解決しているようです。OPからの質問にのみ回答してください。
mickmackusa

-1

これは、PHPの文字列比較ロジックのために機能します。単にあなたはチェックすることができます...

if ($startdate < $date) {// do something} 
if ($startdate > $date) {// do something}

両方の日付は同じ形式でなければなりません。数字は左側にゼロが埋め込まれ、最も重要なものから最も重要でないものの順に並べる必要があります。Y-m-dそしてY-m-d H:i:s、これらの条件を満たしています。


1
d-m-Y動作しません.. Y-m-d(2016-05-08のように先行ゼロがある場合)は動作します。d-m-Y形式でこれらの日付を確認し、文字列0 <2として比較する01-10-201620-02-2016、比較は停止しますが、正しくありません...
Arxeiss

あなたのテクニックがOPの日付を今日の日付と正しく比較できないことの証明です:3v4l.org/SNHKT
mickmackusa

OPの日付形式が異なります。 日付は次のようになり2011-10-2ます。
mickmackusa

-1

日付($ date)を一定の間隔で期限切れにする場合、たとえば、パスワードのリセットを実行するときにトークンの有効期限を設定するには、次の方法があります。

$date = $row->expireDate;

$date->add(new DateInterval('PT24H')); // adds 24 hours

$now = new \DateTime();

if($now < $date) { /* expired after 24 hours */ }

しかし、あなたのケースでは、次のように比較を行うことができます:

$today = new DateTime('Y-m-d');

$date = $row->expireDate;

if($today < $date) { /* do something */ }

この回答は、最初に投稿された質問を無視しています。OPが提供するサンプルデータを使用してください。
mickmackusa

男が助けを求めているのとまったく同じではありませんが、私はこの方法が原則を理解していれば助けになると思いました。
faye.babacar78

私は原則を理解していますが、このコードは尋ねられた質問に答えません。このページはすでに、正しくない無関係な回答で膨れ上がっています。これは研究者を混乱させ、時間を浪費するだけです。私は研究者を探しています。
mickmackusa

まあ、それほど難しいことではないと思います。彼は、date()関数の代わりにDateTime()クラスを使用することもできました。上記の答えは、どういうわけか研究者にアイデアを与えることです。
faye.babacar78

1
私は自分自身を繰り返すのをやめ、この議論から解放します。2番目に高いソリューション(stackoverflow.com/a/3847762/2943403)は、2つの日時オブジェクトを作成する非常に単純な(無敵の)方法を示しています。私はあなたの魔法のrequestDate()方法が何をしているのか全く知りません-それについてどこにも言及されていません。私はあなたの答えを使いませんし、どんな研究者もあなたの解決策を使うことを勧めません。私は自分が投票を変更することを予測していません。
mickmackusa

-2

まず最初に、サーバーの現在の日時に希望する形式を指定してください。

  1. 現在の日時を取得

    $ current_date = getdate();

  2. 必要に応じて、日付と時刻を個別に管理します。

$ current_date_only = $ current_date [year] .'- '。$ current_date [mon] .'-'。$ current_date [mday]; $ current_time_only = $ current_date ['hours']。 ':'。$ current_date ['minutes']。 ':'。$ current_date ['seconds'];

  1. DBでdonly dateとdatetimeのどちらを使用しているかに応じて、それを比較します。

    $ today = $ current_date_only。 ' '。$ current_time_only;

    または

    $ today = $ current_date_only;

    if($ today <$ expireDate)

それが役に立てば幸い


この回答は、元の質問を解決しようとするものではありません。OPは、時間、分、秒には関心がありません。
mickmackusa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.