1

我正在寻找数组中的两个值:

  • 从 08/29/2013 08:00 到 08/29/2013 13:00 的最后一个数组值
  • 第一个数组值从 08/29/2013 12:00 到 08/29/2013 17:00

这是数组:

$dates = array(
    '08/29/2013 08:00',
    '08/29/2013 08:10',
    '08/29/2013 08:11',
    '08/29/2013 12:20',
    '08/29/2013 12:21',
    '08/29/2013 12:21',
    '08/29/2013 17:30',
); // etc.
4

3 回答 3

1

比较时间的最佳方法之一是使用strtotime().

// Original array of date strings
$dates = array(
  '08/29/2013 08:00',
  '08/29/2013 08:10',
  '08/29/2013 08:11',
  '08/29/2013 12:20',
  '08/29/2013 12:21',
  '08/29/2013 12:21',
  '08/29/2013 17:30',
);

// Make a new array of time stamps based on your strings
$dates_dt = array();
foreach($dates as $date)
  $dates_dt[] = strtotime($date);

// Same idea with the dates you want to look at
$date_last1 = strtotime('08/29/2013 08:00');
$date_last2 = strtotime('08/29/2013 13:00');
$date_first1 = strtotime('08/29/2013 12:00');
$date_first2 = strtotime('08/29/2013 17:00');

这是魔术 - 一些非常简单的函数,它们返回数组中最接近的日期之前(或第一个条目)和最接近的日期之后(或最后一个)。

function dateBefore($date, $dateArray){
  $prev = $dateArray[0];
  foreach( $dateArray as $d ){
      if( $d >= $date )
          return date("Y-m-d H:i", $prev);
      $prev = $d;
  }
}

function dateAfter($date, $dateArray){
  foreach( $dateArray as $d ){
      if( $d > $date )
          return date("Y-m-d H:i", $d);
  }
  return date("Y-m-d H:i", end($dateArray));
}

echo dateBefore($date_last1, $dates_dt); // Outputs: 2013-08-29 08:00
echo dateBefore($date_last2, $dates_dt); // Outputs: 2013-08-29 12:21

echo dateAfter($date_first1, $dates_dt); // Outputs: 2013-08-29 12:20
echo dateAfter($date_first2, $dates_dt); // Outputs: 2013-08-29 17:30

http://codepad.org/cBYPuowt

注意 对时间数组进行排序可能是一个好主意,这样它们肯定是按顺序排列的。

foreach($dates as $date)
  $dates_dt[] = strtotime($date);

// Add sort here
sort($dates_dt);

http://codepad.org/jZPIEeJS

于 2013-08-29T04:03:58.343 回答
0

您可以将所有字符串时间戳转换为长值(自 1970 纪元以来的毫秒数)。然后只需计算与上限(例如 2013 年 8 月 29 日 13:00)相比的相关值的增量(例如,大于 2013 年 8 月 29 日 08:00)。最小的增量最接近上限。最大的三角洲是最远的。

这是您计算自纪元以来的秒数的方式:http: //php.net/manual/en/function.strtotime.php

于 2013-08-29T03:15:14.197 回答
0
$nearest = $dates[0];
$now = time();
for ($i = 0; $i < count($dates); $i++) {
  $date = $dates[$i];
  $timestamp = strtotime($date);
  if (abs(strtotime($date) - $now) < abs(strtotime($nearest) - $now))
    $nearest = $date;
}
echo $nearest;
于 2013-08-29T03:51:18.833 回答