【问题标题】:php, get the the highest-closest time to current from array? [duplicate]php,从数组中获取最接近当前的时间? [复制]
【发布时间】:2012-06-26 11:12:26
【问题描述】:

可能重复:
How to get most recent date from an array of dates?

我有一个时间表,它是一个数组:

array(
    '01.01.2012|11:00',
    '01.01.2012|14:30',
    '01.01.2012|16:24', // example match
    '01.01.2012|17:20',
    '01.01.2012|17:43',
    '02.01.2012|10:20',
    '02.01.2012|12:30',
); // etc.

我想要一个可以检查当前日期/时间并与数组中的日期/时间进行比较的 Cron 作业。首先我检查日期是否匹配,没问题。但是我需要从该数组中找到并显示当前时间之后的最早时间。如果同一日期内没有合适的时间,则显示下一个日期的最早时间。

例如:让我们获取上面的数组和01.01.2012|14:45的当前日期/时间

  • 日期匹配,所以我们继续
  • 下次从数组16:24,但是如何用PHP找到呢?如果当前时间高于数组中同一日期的任何时间,那么从下一个日期获取最早的时间?

显然,为了得到正确日期的字符串,我使用“foreach”和“if”,它返回正常。但那我该如何度过时光呢?

【问题讨论】:

标签: php arrays sorting time foreach


【解决方案1】:

Convert to timestampsort 并与current time 进行迭代比较。

$ts = array_map(
        create_function('$a','return strtotime(str_replace("|", " ", $a));'), 
        $dates);
$len= count($ts); $now = time();
sort($ts); 
for($i=0;$i<$len && (!($now<$ts[$i]));$i++);
echo date("d.m.Y|H:i",$ts[$i]);

感兴趣的函数

【讨论】:

  • 哦,我想我明白了,Unix 时间戳,在几秒钟内完成。很好的解决方案,稍后会尝试。谢谢!
【解决方案2】:

如果将这些转换为 UNIX 时间戳,则可以对它们进行数字排序、循环并获取大于当前时间戳的第一项。

【讨论】:

    【解决方案3】:

    您可以考虑将这些日期转换为 UNIX 时间戳:

    function getUnixTimestamp($string) {
        list($date, $time) = explode('|', $string);
        return strtotime("$date $time");
    }
    

    然后你可以使用类似的东西:

    $array = array(); // from example
    $timestamps = array_map('getUnixTimestamp', $array);
    $current = time();
    
    // create an array mapping timestamp to string
    $keyedArray = array_combine($timestamps, $array);
    
    // sort by timestamp
    ksort($keyedArray);
    
    foreach ($keyedArray as $timestamp => $string) {
        if ($timestamp > $current) {
            // this is the first timestamp after current time
        }
    }
    

    您可能需要对$timestamp 做一些额外的检查,确保它是在同一天或第二天,但使用时间图比较比字符串匹配更容易。

    【讨论】:

      【解决方案4】:

      为您的日期时间格式编写一个比较函数,然后循环直到找到大于或等于您的参考日期的日期。

      function compareDateTime($dt1, $dt2) {
         sscanf($dt1, "%d.%d.%d|%d:%d", $day, $month, $year, $hour, $minute);
         $comp1 = $year . $month . $day . $hour . $minute;
         sscanf($dt1, "%d.%d.%d|%d:%d", $day, $month, $year, $hour, $minute);
         $comp2 = $year . $month . $day . $hour . $minute;
      
         return $comp1 - $comp2;
      }
      

      当 $dt1 $dt2 时返回 +ve

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-31
        • 1970-01-01
        • 2019-04-16
        • 1970-01-01
        • 1970-01-01
        • 2020-05-30
        • 1970-01-01
        • 2012-01-24
        相关资源
        最近更新 更多