多维数组查找在两个日期的中间


Multidimensional Array find in middle of two dates

我有一个像下面这样的数组

array(
    "hgfh"  => array("s" => "2011-11-28T07:00-04:00", "e" => "2011-11-29T06:59-04:00"),
    "hgfh"    => array("s" => "2011-11-29T07:00-04:00", "e" => "2011-11-30T06:59-04:00"),
    "hgfh"    => array("s" => "2011-11-30T07:00-04:00", "e" => "2011-12-01T06:59-04:00"),
    "hgfh"    => array("s" => "2011-12-01T07:00-04:00", "e" => "2011-12-02T06:59-04:00"),
    "hgf"     => array("s" => "2011-12-02T07:00-04:00", "e" => "2011-12-05T06:59-04:00"),
    "sog"     => array("s" => "2011-12-05T07:00-04:00", "e" => "2011-12-06T06:59-04:00"),
    "gfd"     => array("s" => "2011-12-06T07:00-04:00", "e" => "2011-12-07T06:59-04:00"),
    "gfd"     => array("s" => "2011-12-07T07:00-04:00", "e" => "2011-12-08T06:59-04:00"),
    "bob"  => array("s" => "2011-12-08T07:00-04:00", "e" => "2011-12-09T06:59-04:00"),
    "tree" => array("s" => "2011-12-09T07:00-04:00", "e" => "2011-12-11T23:00-04:00"),
);

例如,我需要确定当前的date("c");是否在该数组中的"s""e"之间,然后获得键。所以它会说今天是2011-11-30T09:50-04:00,并确定键是hgfh,有什么快捷的方法可以做到这一点吗?我有点担心性能,所以如果有一个方法可能会更好的性能方面,我将不胜感激。

将日期存储为字符串,特别是当您想要进行这种'between'比较时,无论您做什么都将是痛苦的。您应该存储代表这些时间的原始PHP时间戳值,例如

array(
   'hgfh' => array('s' => 1000, 'e' => 2000)
   etc...
)

(显然使用假的时间戳值)。然后就变成了一个简单的问题:

$check = strtotime('2011-11-30T09:50-04:00');
foreach($yourarray as $key => $times) {
   if (($check >= $times[s]) && ($check <= $times[e]))
       break;
   }
}
echo $key;

否则,每次运行check循环时,都要将这些字符串转换为时间值,这将很快变得非常昂贵。始终以本机格式存储时间/日期,并在必要时转换为人类可读的格式。

    function get_matches($date_array) {
        $new_date_array = array_filter($date_array, 'match_dates');
        print_r(array_keys($new_date_array));
    }
    function match_dates($array_element) {
       return date('c') >= $array_element['s'] && date('c') <= $array_element['e'] ? true : false;
    }

"那么它会显示今天是2011-11-30T09:50-04:00"

问题中的这一行表明有人试图交替使用日历日期和本地化时间戳。

这比尝试在日历日期和纯时间戳之间切换要好,但它仍然是模糊的。

如果是关于日历日期的,请按照如下格式存储,例如2011-11-24

如果性能问题,您可以将这些日历日期存储为例如修改的儒略历日期。

时间戳表示一个绝对的时间点,通常以秒为单位。

本地化时间戳表示绝对时间点(通常以秒为单位)加上有效时区偏移量(通常以小时或分钟为单位)的组合。

日历日期代表一个日历日期——开始和结束的时间戳取决于某个地方的管辖权所定义的时间戳。

无论您使用ISO-8601字符串表示还是数字表示,始终要注意清楚您的意图。

乍一看,时间似乎很容易。

但是时间却恰恰是最容易出错的事情之一。