2

我目前正在使用充满事件的数据库的 API 编写一个小日历。(我无法控制数据库的内容)。但是数据库中的事件包含不同格式的日期。(有些只是 dd-mm-yy,有些像 'wednesday 12/06/13',有些是多个日期一起 '12/06/13, 13/06/13, 14/06/13',...等等。)

所以我唯一的问题是多个日期在一起,因为我需要今天之后的第一个日期。

示例:数据库包含:12/06/13、13/06/13、14/06/13、15/06/13、17/06/13 -> 我需要 17/06/13。

使用当前代码,我删除了所有不同的符号,因此我只剩下剩余的数字,并将前 6 个数字转换为日期:

foreach($events as $e)
{
    $start = 0;
    $length = 6;
    $rawDate = $e->calendarsummary;
    $filterDate = preg_replace("/[^0-9]/", "", $rawDate);
    $oneDate = substr($filterDate, $start, $length);
    $finalDate = DateTime::createFromFormat('dmy', $oneDate);
    echo $finalDate->format('l j/m/y');
}

所以这给了我系列中的第一个约会,但我需要今天之后的第一个约会。有没有人有建议?

提前致谢

4

2 回答 2

0

您需要$rawDate使用 PHP 的strpos()函数检查逗号。如果不存在逗号,则照常继续。

但是,如果找到逗号,则需要使用 PHPexplode()函数将日期字符串分解为日期数组。如果它们还没有按日期顺序排列,则需要使用 PHP 的usort()函数对数组进行排序。将它们按顺序排列好后,您可以遍历它们并选择日期大于今天的第一个。一旦你有了那个日期,你就可以正常进行了。

显然,可能有 50 种不同的方法可以做到这一点,

如果您让我了解您的尝试,我很乐意帮助您整理代码。

foreach($events as $e){
    $start = 0;
    $length = 6;
    $rawDate = $e->calendarsummary;

    if (strpos($rawDate, ',')!==false){ //Comma Found, do Explode
        $dates = explode(',', $rawDate);
        usort($dates, 'sortDates');


        foreach($dates as $d){
            $tempDate = new DateTime($d);
            //Do date calculations here to see if the date is beyond today's date.

            //if it is, set $rawDate = $d and continue
            if (...){
                $rawDate=$d;
                break;
            }
        }
    }


    $filterDate = preg_replace("/[^0-9]/", "", $rawDate);
    $oneDate = substr($filterDate, $start, $length);
    $finalDate = DateTime::createFromFormat('dmy', $oneDate);
    echo $finalDate->format('l j/m/y');
}

function sortDates($aItem, $bItem){
    $temp = new DateTime($aItem);
    $a = $temp->getTimestamp();

    $temp = new DateTime($bItem);
    $b = $temp->getTimestamp();

    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

更多信息:

于 2013-06-16T12:14:05.283 回答
0

当您使用 DateTime 类时,您可以进行直接比较,如下所示:-

$dateString = "12/06/13, 13/06/13, 14/06/13, 15/06/13, 17/06/13, 20/06/13";

$dates = explode(', ', $dateString);
$now = new DateTime();
foreach($dates as $date){
    $dateTime = DateTime::createFromFormat('d/m/y', $date);
    if($dateTime > $now){
        $result = $dateTime;
        break;
    }
}

echo $result->format('d/m/y');

输出:-

2013 年 6 月 17 日

于 2013-06-16T12:41:05.960 回答