我有一个像下面这样的数组
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字符串表示还是数字表示,始终要注意清楚您的意图。
乍一看,时间似乎很容易。
但是时间却恰恰是最容易出错的事情之一。