指定された日付を今日と比較する


216

フォローしています

$var = "2010-01-21 00:00:00.0"

この日付を今日の日付と比較したい(つまり、これ$varが今日より前か、今日と等しいかどうか知りたい)

どの機能を使用する必要がありますか?


5
タイムゾーンも設定することをお勧めします
NJInamdar 2014年

回答:


289
strtotime($var);

時間値に変換します

time() - strtotime($var);

からの秒数を与えます $var

if((time()-(60*60*24)) < strtotime($var))

$var最終日以内かどうかチェックします。


1
PHP 4の場合、$ var = "2010-01-21 00:00:00.0"から最後の '.0'を終了します。それ以外の場合、strtotimeは-1を返します
vivoconunxino

1
PHP 7.1を使用しています。戻り値が秒数の整数である場合、サブ秒の部分は単に無視されます。
Diogo Melo 2017年

208

そのフォーマットは標準的な文字列比較に完全に適しています。

if ($date1 > $date2){
  //Action
}

今日の日付をその形式で取得するには、次のように使用しますdate("Y-m-d H:i:s")

そう:

$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";

if ($date < $today) {}

それがそのフォーマットのすばらしいところです。もちろん、それが可能あなたの正確な状況に応じて、あまり効率的で、それはまた、より保守コードに、より便利で、リード全体の多くであるかもしれない-私たちは本当にその審判の判定を作るためにもっと知っておく必要があるだろう。

正しいタイムゾーンについては、たとえば、

date_default_timezone_set('America/New_York');

利用可能なPHPタイムゾーンを参照するには、ここをクリックしてください。


2
これはタイムゾーンも無視します
anushr

@anushr、比較にタイムゾーンが必要な場合、比較の前に日付に時間差を追加できます。これは、mm/dd/yyyy形式の2つの日付時刻文字列を日付に変換して比較するよりも高速です。開発者がシステムの複数のタイムゾーンに日付を持っていると、いつも心配になります。システムに日付を保存し、常に単一のタイムゾーンで保存し、必要なタイムゾーンで表示することをお勧めします。SQLサーバーでもyyyy-mm-ddフォーマットyyyymmddがはるかに速くソートされることに気付いた1998年頃にフォーマット(または)を使い始めました。
AaA

59

どうぞ:

function isToday($time) // midnight second
{
    return (strtotime($time) === strtotime('today'));
}

isToday('2010-01-22 00:00:00.0'); // true

また、いくつかのヘルパー関数:

function isPast($time)
{
    return (strtotime($time) < time());
}

function isFuture($time)
{
    return (strtotime($time) > time());
}

なぜ奇妙な後方論理と無関係なブール値か?「return strtotime($ time)== strtotime( 'today')」、「return strtotime($ time)> time()」、「return strtotime($ time)<time()」だけではないのですか?
ボビージャック、

@ボビー・ジャック:私はそれらの機能により多くの機能があり、余分なコードを削除するのを忘れました。今修正されました。
Alix Axel

ヘルパー関数、具体的にはisPast b / cを+1したところ、aを実行しただけif(strtotime('2013-01-22 00:00:00.00') < time()){....}で済みました。
MDMoore313 2013年

47

PHP 5.2.2+を使用している場合、DateTime OBjectを使用してBoBby Jackを完成させます。

if(new DateTime() > new DateTime($var)){
    // $var is before today so use it

}

これは正しくありません。$ varが現在の日(真夜中以降)の場合、new DateTime()はnew DateTime($ var)より大きくなり、$ varが今日より前であるとは限りません。
dxvargas

46

次のDateTimeクラスを使用できます。

$past   = new DateTime("2010-01-01 00:00:00");
$now    = new DateTime();
$future = new DateTime("2021-01-01 00:00:00");

比較演算子は機能します*:

var_dump($past   < $now);         // bool(true)
var_dump($future < $now);         // bool(false)

var_dump($now == $past);          // bool(false)
var_dump($now == new DateTime()); // bool(true)
var_dump($now == $future);        // bool(false)

var_dump($past   > $now);         // bool(false)
var_dump($future > $now);         // bool(true)

DateTimeオブジェクトからタイムスタンプ値を取得して比較することもできます。

var_dump($past  ->getTimestamp());                        // int(1262286000)
var_dump($now   ->getTimestamp());                        // int(1431686228)
var_dump($future->getTimestamp());                        // int(1577818800)
var_dump($past  ->getTimestamp() < $now->getTimestamp()); // bool(true)
var_dump($future->getTimestamp() > $now->getTimestamp()); // bool(true)

* ===同じ日付を表す場合でも、2つの異なるDateTimeオブジェクトを比較するとfalse を返すことに注意してください。


$future過去になった。:P
mbomb007

私は、どのように時間が飛ぶのか。
サルマンA

13
$toBeComparedDate = '2014-08-12';
$today = (new DateTime())->format('Y-m-d'); //use format whatever you are using
$expiry = (new DateTime($toBeComparedDate))->format('Y-m-d');

var_dump(strtotime($today) > strtotime($expiry)); //false or true

それは私の$varOPでも同じではありません
アレクサス2014

1
(new DateTime())-> format( 'Ym-d');にはPHP> = 5.4が必要です。
webrama.pl 2015年

6

私の経験に基づく1つの注意点として、目的が日付のみである場合は、タイムスタンプを含めるように注意してください。たとえば、今日はだとしましょう"2016-11-09"。タイムスタンプを含む比較は、ここでロジックを無効にします。例、

//  input
$var = "2016-11-09 00:00:00.0";

//  check if date is today or in the future
if ( time() <= strtotime($var) ) 
{
    //  This seems right, but if it's ONLY date you are after
    //  then the code might treat $var as past depending on
    //  the time.
}

上記のコードは正しいように見えますが、比較する日付のみの場合、上記のコードは適切なロジックではありません。どうして?なぜなら、time()とstrtotime()はインクルードタイムスタンプを提供するからです。つまり、両方の日付が同じ日にあっても、時間の違いが問題になります。以下の例を検討してください。

//  plain date string
$input = "2016-11-09";

入力はプレーンな日付文字列であるため、strtotime()on $inputを使用すると、2016-11-09の午前0時であると想定されます。そのため、time()午前0時以降に実行する$inputと、たとえ同じ日であっても、常に過去として扱われます。

これを修正するには、次のように簡単にコーディングできます。

if (date("Y-m-d") <= $input)
{
    echo "Input date is equal to or greater than today.";
}

1
OPがこれを検討したと確信しているため、質問に「00:00:00.0」を含めました
AaA

6

数年後、私はボビージャックの24時間最後の観察が今日ではないことに気づきました。そして、私は答えが非常に賛成されたことに驚いています...

特定の日付が別の日付よりも小さいか、等しいか、大きいかを比較するには、最初にそれらをその日の初めに「下げる」必要があります。つまり、両方の日付で同じ00:00:00の時間について話していることを確認してください。これは次のように簡単かつエレガントに実行できます。

strtotime("today") <=> strtotime($var)

$var指定されたOPのように00:00:00の時間部分がある場合。

<=>必要なものに置き換えます(またはphp 7でこのようにしてください)

また、明らかに、両方について同じタイムゾーンについて話している。サポートされているTimeZonesのリストについて



4

w3schoolsからのジョスアの答えをさらに詳しく説明します。

//create objects for the dates to compare
$date1=date_create($someDate);
$date2=date_create(date("Y-m-d"));
$diff=date_diff($date1,$date2);
//now convert the $diff object to type integer
$intDiff = $diff->format("%R%a");
$intDiff = intval($intDiff);
//now compare the two dates
if ($intDiff > 0)  {echo '$date1 is in the past';}
else {echo 'date1 is today or in the future';}

これがお役に立てば幸いです。Stackoverflowに関する私の最初の投稿!


1

日時オブジェクトを比較します。

(10日間選択した-10日より古いものはすべて「古い」、それ以外は「新しい」)

$now   = new DateTime();
$diff=date_diff($yourdate,$now);
$diff_days = $diff->format("%a");
if($diff_days > 10){
    echo "OLD! " . $yourdate->format('m/d/Y');
}else{
    echo "NEW! " . $yourdate->format('m/d/Y');
}

1

与えられた答えの中には、今日を考慮に入れていないものがあります!

これが私の提案です。

$var = "2010-01-21 00:00:00.0"
$given_date = new \DateTime($var);

if ($given_date == new \DateTime('today')) {
  //today
}

if ($given_date < new \DateTime('today')) {
  //past
}

if ($given_date > new \DateTime('today')) {
  //future
}

0

あなたが時間と日付で物事を行う場合、カーボンはあなたの親友です。

次にパッケージをインストールします。

$theDay = Carbon::make("2010-01-21 00:00:00.0");

$theDay->isToday();
$theDay->isPast();
$theDay->isFuture();
if($theDay->lt(Carbon::today()) || $theDay->gt(Carbon::today()))

lt =より小さい、gt =より大きい

質問のように:

$theDay->gt(Carbon::today()) ? true : false;

そしてはるかに;

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