我从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!";
}
答案 0 :(得分:129)
这是您的代码的正确答案..只需使用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!";
}
答案 1 :(得分:29)
您无法比较日期字符串。使用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!";
}
答案 2 :(得分:14)
如果时间紧迫:
$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!";
}
答案 3 :(得分:4)
您正在将日期作为字符串进行比较,这不起作用,因为比较是字典的。这与排序文本文件时的问题相同,其中行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');
您现有的条件将正常运作。
答案 4 :(得分:2)
基于luttken的回答。以为我会加上我的想法:)
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!";
答案 5 :(得分:2)
另一种解决方案是将日期写为Ymd。
以这种“格式”编写,这很容易比较日期。
var covg = feed["DataItem"]["@name"].Select(f => (string)f.SelectToken("#text"));
它将始终适用于一年中的每一天,并且不依赖于任何函数或转换(PHP将考虑$paymentDate = date('Ymd'); // on 4th may 2016, would have been 20160504
$contractBegin = 20010101;
$contractEnd = 20160101;
echo ($paymentDate >= $contractBegin && $paymentDate <= $contractEnd) ? "Between" : "Not Between";
的int值与$paymentDate
和{{的int值进行比较1}})。
答案 6 :(得分:1)
您可以使用mktime(小时,分钟,秒,月,日,年)功能
$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!";
}
答案 7 :(得分:0)
直接使用
$paymentDate = strtotime(date("d-m-Y"));
$contractDateBegin = strtotime("01-01-2001");
$contractDateEnd = strtotime("01-01-2015");
然后比较就可以了,因为01-01-2015对于PHP的32位日期范围有效,在strtotime的手册中有说明。
答案 8 :(得分:0)
如果您需要将括号日期设为动态..
$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";
}
答案 9 :(得分:0)
另一个解决方案(假设您知道日期格式始终为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
}
它不能与其他任何日期格式一起使用,但是可以。无需转换为秒,也不需要日期功能。
答案 10 :(得分:0)
上述方法很有用,但不是完全验证的,因为如果时间在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
。
要在两者之间获得正确的输出日期,请确保将"AM"
到01:00 AM
的{{1}}值转换为24小时格式。这个小把戏帮助了我。
答案 11 :(得分:0)
简单的解决方案:
function betweenDates($cmpDate,$startDate,$endDate){
return (date($cmpDate) > date($startDate)) && (date($cmpDate) < date($endDate));
}
答案 12 :(得分:-1)
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);