簡體   English   中英

PHP 檢查日期是否在兩個日期之間

[英]PHP check if date between two dates

我從 Stackoverflow 獲得了這段代碼並稍作更改以適應今天的日期。

我想檢查今天是否適合兩個日期。 但這是行不通的。 我錯過了什么?

$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!";  
}

編輯:使用<=>=來計算今天的日期。

這是您的代碼的正確答案。 只需使用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!";  
}

您無法比較日期字符串。 改用 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!";  
}

如果時間很重要:

$paymentDate = strtotime(date("Y-m-d H:i:s"));
$contractDateBegin = strtotime("2014-01-22 12:42:00");
$contractDateEnd = strtotime("2014-01-22 12:50:00");

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

基於盧特肯的回答。 以為我會添加我的扭曲:)

function dateIsInBetween(\DateTime $from, \DateTime $to, \DateTime $subject)
{
    return $subject->getTimestamp() > $from->getTimestamp() && $subject->getTimestamp() < $to->getTimestamp() ? true : false;
}

$paymentDate       = new \DateTime('now');
$contractDateBegin = new \DateTime('01/01/2001');
$contractDateEnd   = new \DateTime('01/01/2016');

echo dateIsInBetween($contractDateBegin, $contractDateEnd, $paymentDate) ? "is between" : "NO GO!";

您正在將日期作為字符串進行比較,這不起作用,因為比較是按字典順序進行的。 這與排序文本文件時的問題相同,其中第20行將出現在第100行之后,因為內容不被視為數字,而是被視為 ASCII 代碼序列。 此外,創建的日期都是錯誤的,因為您使用的是字符串格式字符串,其中需要時間戳(第二個參數)。

相反,您應該比較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');

然后,您現有的條件將正常工作。

另一種解決方案是考慮將日期寫為 Ymd。

以這種“格式”編寫,比較日期非常容易。

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

它始終適用於一年中的每一天,並且不依賴於任何函數或轉換(PHP 將考慮$paymentDate的 int 值與contractBegincontractEnd的 int 值進行比較)。

因為我很懶:

$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)

如果您需要括號日期是動態的..

$todayStr = date('Y-m-d');
$todayObj=date('Y-m-d', strtotime($todayStr));
$currentYrStr =  date('Y');
$DateBegin = date('Y-m-d', strtotime("06/01/$currentYrStr"));
$DateEnd = date('Y-m-d', strtotime("10/01/$currentYrStr"));
if (($todayObj > $contractDateBegin) && ($paymentDate < $contractDateEnd)){
    $period="summer";
}else{
   $period="winter";  
}

簡單的解決方案:

function betweenDates($cmpDate,$startDate,$endDate){ 
   return (date($cmpDate) > date($startDate)) && (date($cmpDate) < date($endDate));
}

您可以使用 mktime(hour, minute, seconds, month, day, year) 函數

$paymentDate = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
$contractDateBegin = mktime(0, 0, 0, 1, 1, 2001); 
$contractDateEnd =  mktime(0, 0, 0, 1, 1, 2012);

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

應該注意的是,您可以按原樣比較Datetime()對象。 因此,上面的@luttkens 答案的簡化和清潔版本:

$paymentDate       = new DateTime(); // Today
$contractDateBegin = new DateTime('2001-01-01');
$contractDateEnd   = new DateTime('2015-01-01');

if ($paymentDate >= $contractDateBegin && $paymentDate < $contractDateEnd) {
  // is in between
}

直接使用

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

然后比較就可以了,因為您的 01-01-2015 對 PHP 的 32 位日期范圍有效,如 strtotime 的手冊中所述。

另一種解決方案(假設您知道您的日期格式始終是帶有前導零的 YYYY/MM/DD)是 max() 和 min() 函數。 我認為這沒關系,因為所有其他答案也假設 yyyy-mm-dd 格式,如果您想確保它們按日期順序排序,這是文件系統中文件夾的通用命名約定。

正如其他人所說,給定數字的順序,您可以比較字符串,不需要 strtotime() 函數。

例子:

$biggest = max("2018/10/01","2018/10/02");

優點是您可以在其中放置更多日期,而不僅僅是比較兩個日期。

$biggest = max("2018/04/10","2019/12/02","2016/03/20");

要確定日期是否在兩個日期之間,您可以比較 min() 和 max() 的結果

$startDate="2018/04/10";
$endDate="2018/07/24";
$check="2018/05/03";
if(max($startDate,$check)==min($endDate,$check)){
    // It's in the middle
}

它不適用於任何其他日期格式,但適用於該格式。 無需轉換為秒,也無需日期功能。

上述方法很有用,但它們不是完全可靠的,因為如果時間在 12:00 AM/PM 和 01:00 AM/PM 之間會出錯。 盡管在時間之間,它將返回“No Go”。 這是相同的代碼:

$time = '2019-03-27 12:00 PM';

$date_one = $time; 
$date_one = strtotime($date_one);
$date_one = strtotime("+60 minutes", $date_one);
$date_one =  date('Y-m-d h:i A', $date_one);

$date_ten = strtotime($time); 
$date_ten = strtotime("-12 minutes", $date_ten); 
$date_ten = date('Y-m-d h:i A', $date_ten);

$paymentDate='2019-03-27 12:45 AM';

$contractDateBegin = date('Y-m-d h:i A', strtotime($date_ten)); 
$contractDateEnd = date('Y-m-d h:i A', strtotime($date_one));

echo $paymentDate; 
echo "---------------"; 
echo $contractDateBegin; 
echo "---------------"; 
echo $contractDateEnd; 
echo "---------------";

$contractDateEnd='2019-03-27 01:45 AM';

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

在這里你會得到輸出"NO Go"因為12:45 > 01:45

要在兩者之間獲得正確的輸出日期,請確保從01:00 AM12:00 AM"AM"值將轉換為 24 小時格式。 這個小技巧幫助了我。

由於語言環境,我可能遇到了一些故障。 這對我有用。 為簡潔起見,省略了變量聲明。 time()strtotime()都返回int以便比較整數

if (time() >= strtotime("27.07.2022") && time() <= strtotime("28.07.2022")){

簡單的方法,適用於日期和日期時間:

// Check if today falls between two dates
$start_date = strtotime('01/01/2001');
$end_date = strtotime('01/01/2015');
$today = strtotime('today');

if($today >= $start_date && $today <= $end_date) {
  // Today is between two dates
}
function get_format($df) {

    $str = '';
    $str .= ($df->invert == 1) ? ' - ' : '';
    if ($df->y > 0) {
        // years
        $str .= ($df->y > 1) ? $df->y . ' Years ' : $df->y . ' Year ';
    } if ($df->m > 0) {
        // month
        $str .= ($df->m > 1) ? $df->m . ' Months ' : $df->m . ' Month ';
    } if ($df->d > 0) {
        // days
        $str .= ($df->d > 1) ? $df->d . ' Days ' : $df->d . ' Day ';
    } 

    echo $str;
}

$yr=$year;
$dates=$dor;
$myyear='+'.$yr.' years';
$new_date = date('Y-m-d', strtotime($myyear, strtotime($dates)));
$date1 = new DateTime("$new_date");
$date2 = new DateTime("now");
$diff = $date2->diff($date1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM