PHP检查日期是否在当月的第一天和最后一天之间

时间:2014-11-04 18:29:19

标签: php date

检查$ datetest数组以查明设置日期是否在当月的第一天和最后一天之间。输出错误。日期,例如'11 -08-2014','11 -8-2014',在输出中是对的。

//get First day of Month
//get Last day of Month

$first_day_of_month = date('m-01-Y');

$last_day_of_month = date('m-t-Y');

echo "First Day of Month: ";
echo $first_day_of_month;

echo "<br />";

echo "Last Day of Month: ";
echo $last_day_of_month;

$datetest = array('11-30-2014', '11-31-2014', '11-08-2014', '11-8-2014', '11-9-2014', '11-11-2014', '11-24-2014', '11-1-2014', '10-30-2014', '12-1-2014', '11-1-1997');

echo "<br /><br />";

foreach ($datetest as $datetest) {  
if (($datetest >= $first_day_of_month) && ($datetest <= $last_day_of_month)){

    echo "$datetest :";
    echo " Is in Month!";
    echo "<br />";

} else {
    echo "$datetest :";
    echo "Not in Month!";
    echo "<br />";
}
}

输出: 每月第一天:2014年1月11日 每月最后一天:2014年11月30日

2014年11月30日:是在月份!

2014年11月31日:不是月份!

2014年8月11日:在月份!

2014年8月11日:不是月份! X

11-9-2014:不是月份! X

2014年11月11日:是月份!

2014年11月24日:在月份!

11-1-2014:是月份!

10-30-2014:不是月份!

12-1-2014:不是月份!

11-1-1997:是月份! X

5 个答案:

答案 0 :(得分:3)

您的代码存在的问题是您没有比较日期,而是比较代表它们的字符串。如果你想这样做,你必须重新格式化你的日期(为了得到像YYYY-mm-dd这样的格式),或者更好的是,你只需要在时间戳中转换它们并比较它们(你可以用{ {1}})。

答案 1 :(得分:3)

$first_day_of_month = strtotime(date('Y-m-01'));
$last_day_of_month = strtotime(date('Y-m-t 23:59:59'));

echo "First Day of Month: ";
echo $first_day_of_month;

echo "<br />";

echo "Last Day of Month: ";
echo $last_day_of_month;

$datetests = array('2014-11-30', '2014-11-31', '2014-11-08');
echo "<br /><br />";

foreach ($datetests as $datetest) {  
if ((strtotime($datetest) >= $first_day_of_month) && (strtotime($datetest) <= $last_day_of_month)){

    echo "$datetest :";
    echo " Is in Month!";
    echo "<br />";

} else {
    echo "$datetest :";
    echo "Not in Month!";
    echo "<br />";
}
}

答案 2 :(得分:3)

正如@ mark91告诉你的那样,你现在正在进行的比较是错误的,因为你实际上是将stringstring进行比较,而不是实际日期:

最佳(如果可能)解决问题的方法是首先将日期格式更改为YYYY-mm-dd,然后在比较值之前使用strtotime()

如果无法更改值,您可以使用mktime的组合来“构建”日期(作为数字)和explode()将“您的”格式转换为正确的时间格式,如我试过的示例代码

Test Date Comparisons

注意我正在使用mktime() 1(第一天)和date('n')(月中的天数=等于月的最后一天)使用explode构建开始日期和结束日期。有关详情,请查看date() function

循环内的脚本,将格式不佳的日期中断(mktime())到一个数组中,然后first将日期生成回可以使用的数字日期表示(unix时间戳)方便和正确比较值。


重要部分:

使用以下方式构建last$first_day_of_month = mktime(0,0,0,date('n'),1,date('Y')); $last_day_of_month = mktime(23,59,59,date('n'),date('t'),date('Y')); 日期

$split_date = explode("-",$datetest); 
$comp_date = mktime(0,0,0,$split_date[0],$split_date[1],$split_date[2]); 

拆分并建立比较日期:

if (($comp_date >= $first_day_of_month) && ($comp_date <= $last_day_of_month)){

比较unix时间戳而不是字符串:

{{1}}

答案 3 :(得分:0)

您可以通过与一年中的月份进行比较来拆分比较,然后执行有效的日期检查。 如果您不会遇到32-08-20140-08-2014之类的问题,则可以保留日检查。

 public function isWithinCurrentMonth($date)
 {
    $current_month = date('Y-m');
    $transaction_date_month = date('Y-m', strtotime($date));
    $transaction_day = $date('d', strtotime($date));
    $last_day = $date('t');

    return $current_month == $transaction_date_month
         // day validity check
        && intval($transaction_day) > 0
        && intval($transaction_day) <= intval($last_day);
 }

答案 4 :(得分:-1)

因为date()返回一个字符串。使用 intval()

将字符串转换为int
// gets the year (as an integer)
$date = intval(date('Y'));

整数比较比字符串比较容易得多。