如何在不指定年份

时间:2018-02-28 23:35:54

标签: php

我有一个脚本,用户可以设置一个频率,以确定他们何时希望它运行。

他们指定

  • 他们希望它运行的月份
  • 该月的某一天
  • 时间(24小时格式)

他们没有指定年份,脚本需要找到匹配的下一个最接近的日期。

PHP

我提出日期的方式是通过用户选择的一个月数组,我可以将所有日期输出到一个漂亮的数组

$scheduler_months = unserialize($row['scheduler_months']);
foreach ($scheduler_months as $scheduler_month) {
    $next_date[] = $scheduler_month."/".$row['scheduler_date']." ".$row['scheduler_time'];
}

将会出现

Array ( [0] => 2/28 12:00 [1] => 4/28 12:00 [2] => 12/28 12:00 )

所以现在在这一点上我需要弄清楚基于今天的下一个最接近日期的起点是什么,显然如果下一个最接近的日期是在明年,它需要足够聪明才能弄明白。我根本不知道如何根据数组中的日期找到下一个最近的日期。

1 个答案:

答案 0 :(得分:1)

很容易弄清楚日期的年份 - 如果您使用strtotime将它们转换为unix时间,您可以确定今年的日期是否已过去或不是,如果是,你可以在明年指定那个日期。

$scheduler_months = unserialize($row['scheduler_months']);
$now = strtotime("now"); # get the unix time in seconds 'now'
foreach ($scheduler_months as $scheduler_month) { 
    # $tmp will be holding the date in the form of YYYY-MM-DD HH:MM
    $tmp = date("Y")."-".$scheduler_month."-".$row['scheduler_date']." ".$row['scheduler_time'];
    if(strtotime($tmp) - $now < 0) # if date is in the past, assign it to the next year
            $tmp = (date("Y")+1)."-".$scheduler_month."-".$row['scheduler_date']." ".$row['scheduler_time'];
    $next_date[] = $tmp;
}

# Initialize $smallest and $smallest_key
$smallest = strtotime($next_date[0])-$now;
$smallest_key = 0;

foreach($next_date as $key => $val) {
        $time_diff = strtotime($val) - $now;
        if($time_diff < $smallest) {
                $smallest_key = $key;
                $smallest = $time_diff;
        }
}

在第一部分中,我修改了你的foreach循环,以根据unix时间确定正确的年份。我已将日期格式更改为YYYY-MM-DD HH:MM。如果日期的unixtime小于当前的unix时间,则下一个最近的日期是明年。

在第二部分中,我初始化两个变量 - $smallest,它保持相对于现在的最小时间(以秒为单位)和$smallest_key,它保存最小时间的数组键。

然后我循环遍历$next_date,我寻找从现在到任一日期的最短时间。