Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 日期计算不符合预期_Php_Sorting_Date - Fatal编程技术网

Php 日期计算不符合预期

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

我有一个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;
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));
}