[英]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 值與contractBegin
和contractEnd
的 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 AM
到12: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.