【问题标题】:PHP: Checking a date against an array of dates to get the nearest datePHP:根据日期数组检查日期以获取最近的日期
【发布时间】:2013-02-15 14:17:50
【问题描述】:

我需要检查一个特定日期是否已通过,如果已通过,则将根据日期数组检查它以查看最接近的日期。

我已经开始了,但是

代码:

<?php

    function getCurrDate ($c_id){   

// Fetch the course date    
$course_nxt_date = "2013-02-03";

// fetch current date
   $today = date("Y-m-d");

// Check if course date is in the future
if($course_nxt_date > $today){
    $course_date = $course_nxt_date;
    return $course_date;
}
// Check if course date is exactly today
elseif($course_nxt_date == $today){
    $course_date = $course_nxt_date;
    return $course_date;    
}
// Check if course date is passed
else{   

// Since course date is passed, get an array of future dates from database
$all_course_dates_query = @mysql_query("select * from pub_calendar_dates where course_id = '$c_id' order by course_date asc");

//Loop through the array
        $all_course_dates_arr = array();
        while ($all_course_dates_row = @mysql_fetch_assoc($all_course_dates_query)){
// assign each variable in the $all_course_dates_row to a new array $all_course_dates_arr
                  $all_course_dates_arr[] = $all_course_dates_row['course_date'];
        }

// This is where I became blank on what to do next and Im stucked...Need help from here

        return $course_date;        
}   

    }

?>

更多细节:

如果 $course_nxt_date 已通过,它将针对同一课程、特定数据库表中某处的某些现有未来日期进行检查。 在对照数组 $all_course_dates_arr[] 检查 $course_nxt_date 时,我需要获取最接近 $course_nxt_date 的日期

Example of dates that could be in the array - $all_course_dates_arr[]:

        $all_course_dates_arr[0] = "2013-01-25"; 
        $all_course_dates_arr[1] = "2013-04-08"; 
        $all_course_dates_arr[2] = "2013-06-13";
        $all_course_dates_arr[3] = "2013-08-03";
        $all_course_dates_arr[4] = "2013-02-17"; 

自从

$course_nxt_date = "2013-02-03";

该函数应输出最近的日期,如下所示:

echo getCurrDate(18);

Output - 2013-02-17

我很乐意在这方面获得帮助...谢谢!

【问题讨论】:

  • 如果您使用epoch timestamps,您可能更容易比较这些值。您可以使用类似于this 的内容来获得最接近的匹配项。
  • 我认为在查询中使用DATEDIFF 只从数据库中检索最接近的日期会更容易。
  • 使用日期库的时间戳可以让您找到两天之间的差异。为此,您必须正确地自定义函数

标签: php arrays date


【解决方案1】:

如果使用 php5.3+,这可能是最简单的方法。

$days = getDifference("2013-02-03","2013-01-25");

function getDifference($date1, $date2){

    // Format for date variables is "YYYY-MM-DD"
    $objDate1 = new DateTime($date1);
    $objDate2 = new DateTime($date2);
    $interval = $objDate1->diff($objDate2);

    return $interval->days; //This would return the difference in number of days
}

由于您不包括时间,因此您可以匹配的最短时间跨度是几天。因此,现在您可以发送 2 个变量并获取差异,并在循环中检查哪个变量的差异最短。

【讨论】:

    【解决方案2】:

    您可以使用 strtotime 获取时间戳,然后循环遍历数组,同时跟踪最小的差异:

    $date_check = strtotime("02-15-2013"); // Gives you a timestamp of the date
    
    $difference       = NULL; // Holds the difference of the closest date
    $difference_index = NULL; // Holds the index in the array
    
    for($i = 0; $i < count($dates_arr); $i++) {
        $d = $dates_arr[$i]; // May need to convert $d into a timestamp if it isn't already
    
        $diff = abs($d - $date_check); // abs to get the absolute difference
    
        // If the difference is smaller than the absolute difference of the last date
        // we need to update our values here
        if($difference == NULL || $diff < $difference) {
            $difference = $diff;
            $difference_index = $i;
        }
    }
    
    print "The closest should be at index " . $difference_index;
    

    类似的东西 - 还没有时间测试它。只是在这里打出来的,但我相信逻辑是正确的。

    【讨论】:

    • 这确实帮助我获得了数组中的最新日期,以便我可以再次将其与当前日期进行比较。帮了大忙!
    【解决方案3】:

    我会在 sql 中进行检查,如下所示。这样做时请确保您的 sql 是安全的。

    $result = @mysql_query("select TOP 1 * from pub_calendar_dates where course_id = '$c_id' AND course_date >= '$course_nxt_date' order by course_date asc");
    

    所以这将返回一个结果,下一个课程的日期最接近给定日期。

    希望这会有所帮助,祝你好运:)

    【讨论】:

      【解决方案4】:

      最好在数据库中进行:

      SELECT DATEDIFF(curdate(), course_date) AS diff
      ...
      WHERE course_date >= curdate()
      ORDER BY diff ASC
      LIMIT 1
      

      【讨论】:

        猜你喜欢
        • 2017-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-27
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多