php - 在日期范围列表中省略多余的月份和年份

标签 php date datetime formatting

我遇到了关于事件日期的奇怪问题,我已努力修复它但无法修复。

我附上了我想如何在页面上显示日期的屏幕截图: enter image description here

图中是Aktion中的第一个事件Deine Energie!是 5 个事件的组合,每个事件都有其开始日期和结束日期。

事件的第一部分是从 4 月 4 日开始到 4 月 4 日结束的为期 1 天的事件。同样,第二部分是4月7日,第三部分是4月9日,第四部分是4月20日

最后一部分从 5 月 5 日开始到 5 月 10 日结束。

日期以这种格式存储在数据库中: 我正在显示事件最后一部分的日期。 事件开始日期:2013-05-05 00:00:00 事件结束日期:2013-05-10 00:00:00

所以我想以图片中显示的格式显示日期。

有多种情况: 首先,如果所有日期都在一个月内,那么我们只在末尾显示一次月份名称。 其次,如果更改了月份,则月份名称将显示在更改月份的日期之后。

我在 while 循环中获取事件日期,那么如何在循环中将当前事件日期与即将到来的事件日期进行比较。

这是我到目前为止用来从数据库中获取日期的代码..

    $nid = $row->nid;  
$get_product_id = "SELECT product_id from {uc_product_kits} where nid='$nid'";
$res = db_query($get_product_id);
while ($get_product_id_array_value = db_fetch_array($res)) {
    $prductid = $get_product_id_array_value['product_id'];
    $start_date = db_query("select event_start,event_end from {event} where nid=%d",$prductid);
    $start_date_value = db_fetch_object($start_date);
    $end_value = $start_date_value->event_start;

    $event_end_date = $start_date_value->event_end;
    $TotalStart =  date("d M Y", strtotime($end_value));
    $TotalEnd = date("d M Y", strtotime($event_end_date));
    $onlyMonthStart =  date("M", strtotime($end_value));
    $onlyMonthEnd = date("M", strtotime($event_end_date));
    //$groupMonth = db_query("select event_start,event_end, month  from {event} where nid=%d group by ",$prductid);
    if($TotalStart == $TotalEnd ){
        $startDay = date("d", strtotime($end_value));
        $startMonth = date("M", strtotime($end_value));
        if(in_array($startMonth,$newMonth)) {
            echo $onlstartdate;
        } 
        else {
              $onlstartdate =  date("d", strtotime($end_value));
             echo $onlstartdate;
             $tempStorage[] = $startMonth
        }
        //$newMonth[] = $startMonth;
    }
}

最佳答案

最简单的方法是首先将查询中的所有数据收集到例如数组。

然后才遍历数组。将所有数据放在一起将使您能够比较两个连续的日期范围,以确定您需要为每个日期范围打印的详细信息级别。

注释示例:

// collect data from SQL query into structure like this:

$events = array(
    array("event_start" => "2013-4-4", "event_end" => "2013-4-4"),
    array("event_start" => "2013-4-7", "event_end" => "2013-4-7"),
    array("event_start" => "2013-4-9", "event_end" => "2013-4-9"),
    array("event_start" => "2013-4-20", "event_end" => "2013-4-20"),
    array("event_start" => "2013-5-5", "event_end" => "2013-5-10"),
    array("event_start" => "2014-1-1", "event_end" => "2014-1-2"),
);

// the actual code for range list generation:

for ($i = 0; $i < count($events); $i++)
{
    // parse start and end of this range
    $this_event = $events[$i];
    $this_start_date = strtotime($this_event["event_start"]);
    $this_end_date = strtotime($this_event["event_end"]);

    // extract months and years
    $this_start_month = date("M", $this_start_date);
    $this_end_month = date("M", $this_end_date);
    $this_start_year = date("Y", $this_start_date);
    $this_end_year = date("Y", $this_end_date);

    $last = ($i == count($events) - 1);
    // parse start and end of next range, if any
    if (!$last)
    {
        $next_event = $events[$i + 1];
        $next_start_date = strtotime($next_event["event_start"]);
        $next_end_date = strtotime($next_event["event_end"]);

        $next_start_month = date("M", $next_start_date);
        $next_end_month = date("M", $next_end_date);
        $next_start_year = date("Y", $next_start_date);
        $next_end_year = date("Y", $next_end_date);
    }

    // ranges with different starting and ending months always go
    // on their own line
    if (($this_start_month != $this_end_month) ||
        ($this_start_year != $this_end_year))
    {
        echo date("j M", $this_start_date);
        // print starting year only if it differs from ending year
        if ($this_start_year != $this_end_year)
        {
            echo " ".date("Y", $this_start_date);
        }
        echo "-".date("j M Y", $this_end_year)." <br/>\n";
    }
    else
    {
        // this is range starting and ending in the same month

        echo date("j", $this_start_date);
        // different starting and ending day
        if ($this_start_date != $this_end_date)
        {
            echo "-".date("j", $this_end_date);
        }

        $newline = false;
        // print month for the last range;
        // and for any range that starts(=ends) in different month
        // than the next range ends
        if ($last ||
            ($this_start_month != $next_end_month))
        {
            echo " ".date("M", $this_start_date);
            $newline = true;
        }

        // print year for the last range;
        // and for any range that starts(=ends) in different year
        // than next range ends
        if ($last ||
            ($this_start_year != $next_end_year) ||
            ($next_start_month != $next_end_month))
        {
            echo " ".date("Y", $this_start_date);
            $newline = true;
        }

        if ($newline)
        {
            echo " <br/>\n";
        }
        else
        {
            // month (and year) will be printed for some future range
            // on the same line
            echo ", ";
        }
    }
}

这个输出:

4, 7, 9, 20 Apr <br/>
5-10 May 2013 <br/>
1-2 Jan 2014 <br/>

关于php - 在日期范围列表中省略多余的月份和年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16076014/

相关文章:

php - 带有产品 ID 数组的 Paypal 返回

当日为 31 且下个月没有时,javascript 日期 setMonth 失败

datetime - Grails 中的时间格式/选择器?

visual-studio-2010 - Visual Studio 2010 中的 SQLite DateTime <无法读取数据>

php - 扩展 MySQLi 类以在页面上解释 SQL 查询

php - 使用 INTERSECT 运算符时出现 SQL 错误

php - 获取当月和上个月的所有unix时间戳

java - Android 转换月份名称时出错

python - Django 模板 datetime.weekday 名称

python - 尝试访问 Pandas 系列中的元素时出错