Php 日期计算不符合预期
我有一个PHP函数,可以在数组中查找第一个和最后一个日期,这样它们就可以以“2月5日到3月4日”的形式显示 然而,我发现有时序列会被破坏,所以我得到的不是“9月1日至11月2日”,而是“9月1日至10月26日,10月27日至11月2日” 代码是:Php 日期计算不符合预期,php,sorting,date,Php,Sorting,Date,我有一个PHP函数,可以在数组中查找第一个和最后一个日期,这样它们就可以以“2月5日到3月4日”的形式显示 然而,我发现有时序列会被破坏,所以我得到的不是“9月1日至11月2日”,而是“9月1日至10月26日,10月27日至11月2日” 代码是: function daterange($datearray){ if(is_array($datearray)){ $resultArray = array(); $index = -1; $last = 0; $textdates = NULL; f
function daterange($datearray){
if(is_array($datearray)){
$resultArray = array();
$index = -1;
$last = 0;
$textdates = NULL;
foreach ($datearray as $date) {
$timestamp = strtotime($date);
if (false !== $timestamp) {
$diff = $timestamp - $last;
if ($diff > 86400) {
$index = $index + 1;
$resultArray[$index][] = $date;
} elseif ($diff > 0) {
$resultArray[$index][] = $date;
} else {
// Error! dates are not in order from small to large
}
$last = $timestamp;
}
}
找到问题和解决方案的关键是导致问题的具体日期。这是我们从英国夏季时间改为格林威治标准时间的一天,因此一天实际上有90000秒,而不是86400秒 换线
if ($diff > 86400) {
到
问题解决了
在其他应用程序中,类似的问题可能会出现在春季,一天中只有82800秒
我希望这可能会对某人有所帮助,这是对我在这里得到的帮助的一个小小回报。从您发布的内容来看:
$dates = array_map('strototime', $datearray);
$start = min($dates);
$end = max($dates);
或者,如果需要原始数组中的日期:
$dates = array_map('strototime', $datearray);
$start = $datearray[array_search(min($dates), $dates)];
$end = $datearray[array_search(max($dates), $dates)];
读了你的评论后,我想到了这一点。它可能可以简化得更多,但这里是:
$datearray = array( '2014-01-10', '2014-01-11', '2014-02-10', '2014-02-11' );
$dates = array_map('strtotime', $datearray);
sort($dates);
$dates = array_chunk($dates, 2);
foreach($dates as $date) {
echo $start = date('d M', reset($date));
echo $end = date('d M', end($date));
}
什么是阵列?什么是第一个和最后一个(最小值和最大值)?这太复杂了。只需使用数组排序,获取第一个和最后一个值,就完成了…如果数组中的日期列表中存在间隙,则获取第一个和最后一个值不起作用。例如,如果日期为2014-01-1012014-01-1112014-02-1012014-02-11,则第一个和最后一个日期将给出“1月10日至2月11日”,而我需要它给出“1月10日至1月11日,2月10日至2月11日”。使用其他解决方案编辑。我仍然觉得我没有所有的信息,但让我知道。很多问题。像这样的约会不要用数学。很好。甚至比我精心设计的方法还要好。见我上面的评论。
$datearray = array( '2014-01-10', '2014-01-11', '2014-02-10', '2014-02-11' );
$dates = array_map('strtotime', $datearray);
sort($dates);
$dates = array_chunk($dates, 2);
foreach($dates as $date) {
echo $start = date('d M', reset($date));
echo $end = date('d M', end($date));
}