82

このコードは Stackoverflow から取得し、今日の日付で動作するように少し変更しました。

今日が 2 つの日付の間に収まるかどうかを確認したい。しかし、これは機能していません。私は何が欠けていますか?

$paymentDate = date('d/m/Y');
echo $paymentDate; // echos today! 
$contractDateBegin = date('d/m/Y', '01/01/2001');
$contractDateEnd = date('d/m/Y', '01/01/2015');

if ($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd)
{
  echo "is between";
}
else
{
echo "NO GO!";  
}
4

14 に答える 14

198

編集:<=またはを使用して、>=今日の日付を数えます。

これはあなたのコードの正しい答えです。strtotime() php 関数を使用するだけです。

$paymentDate = date('Y-m-d');
$paymentDate=date('Y-m-d', strtotime($paymentDate));
//echo $paymentDate; // echos today! 
$contractDateBegin = date('Y-m-d', strtotime("01/01/2001"));
$contractDateEnd = date('Y-m-d', strtotime("01/01/2012"));
    
if (($paymentDate >= $contractDateBegin) && ($paymentDate <= $contractDateEnd)){
    echo "is between";
}else{
    echo "NO GO!";  
}
于 2013-09-28T18:30:40.480 に答える
35

日付文字列を比較することはできません。代わりにPHP のDateTimeオブジェクトを使用することをお勧めします。

$paymentDate = new DateTime(); // Today
echo $paymentDate->format('d/m/Y'); // echos today! 
$contractDateBegin = new DateTime('2001-01-01');
$contractDateEnd  = new DateTime('2015-01-01');

if (
  $paymentDate->getTimestamp() > $contractDateBegin->getTimestamp() && 
  $paymentDate->getTimestamp() < $contractDateEnd->getTimestamp()){
  echo "is between";
}else{
   echo "NO GO!";  
}
于 2013-09-28T18:22:03.560 に答える
5

別の解決策は、Ymd として記述された日付を考慮することでした。

この「フォーマット」で書かれているため、日付を比較するのは非常に簡単です。

$paymentDate       = date('Ymd'); // on 4th may 2016, would have been 20160504
$contractBegin     = 20010101;
$contractEnd       = 20160101;
echo ($paymentDate >= $contractBegin && $paymentDate <= $contractEnd) ? "Between" : "Not Between";

これは常に 1 年中毎日機能し、関数や変換に依存しません (PHP は の int 値を と の int 値と$paymentDate比較します)。contractBegincontractEnd

于 2016-05-10T20:23:53.427 に答える
5

日付を文字列として比較していますが、比較は辞書順であるため機能しません。これはテキスト ファイルを並べ替えるときと同じ問題です。コンテンツは数値ではなく ASCII コードのシーケンスとして扱われるため、20行の後に行が表示されます。100さらに、タイムスタンプが必要な場所 (2 番目の引数) で文字列形式の文字列を使用しているため、作成された日付はすべて間違っています。

これの代わりに、オブジェクトのタイムスタンプを比較する必要がありDateTimeます。たとえば、次のようになります。

 $paymentDate = date_create();
 $contractDateBegin = date_create_from_format('d/m/Y', '01/01/2001');
 $contractDateEnd = date_create_from_format('d/m/Y', '01/01/2015');

これで、既存の条件が正しく機能します。

于 2013-09-28T18:12:55.087 に答える
0

直接使用

$paymentDate = strtotime(date("d-m-Y"));
$contractDateBegin = strtotime("01-01-2001");
$contractDateEnd = strtotime("01-01-2015");

strtotime のマニュアルに記載されているように、2015 年 1 月 1 日が PHP の 32 ビットの日付範囲に対して有効であるため、比較は問題ありません。

于 2013-09-28T18:24:28.093 に答える
0

私は怠け者なので:

$paymentDate = new DateTime();
$contractStartDate = new Datetime('01/01/2001');
$contractEndDate = new Datetime('01/01/2015');
$payable = $paymentDate < $contractEndDate && $contractStartDate > $paymentDate; //bool

var_dump($payable)

画面:

bool(false)

機能として

function isPayable(DateTime $payDate, DateTime $startDate, DateTime $endDate):bool 
{
    return $payDate > $startDate && $payDate < $endDate;
}

var_dump(isPayable(new DateTime(), new Datetime('01/01/2001'), new DateTime('01/01/2015')));
var_dump(isPayable(new DateTime('2003-03-15'), new Datetime('2001-01-01'), new DateTime('2015-03-01')));



画面:

bool(false)
bool(True)
于 2022-02-02T16:02:04.537 に答える