2013-04-18 64 views
6

我遇到了有关事件日期的奇怪问题,并且我尽力使其得到解决,但无法完成。省略日期范围列表中的冗余月份和年份

我附上的我多么想在页面上显示的日期的截图: enter image description here

在图片中AKTION第一事件Deine科特布斯!是5个事件的组合,每个事件都有其开始日期和结束日期。

活动的第一部分是1日活动,活动从4月4日开始,到4月4日结束。第二部分同样在4月7日,4月9日第3部分和4月20日第4部分

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

日期以这种格式存储在数据库中: 我正在显示事件的最后部分的日期。 活动开始日期:2013年5月5日00:00:00 活动结束日期:2013年5月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; 
    } 
} 

回答

4

最简单的做法是首先将查询中的所有数据收集到阵列。

只有然后遍历数组。将所有数据放在一起将允许您比较两个连续日期范围,以决定每个日期需要打印的详细程度。

评论例如:

// 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/> 
+0

我已经更新了我的一些示例代码的答案。 – 2013-04-18 09:44:33

+1

谢谢马丁。这对我有效。 – 2013-04-18 12:41:47

+0

不客气。快乐,它帮助你。 – 2013-04-18 12:46:52

0

好吧,既然你需要从一个循环到另一个比较值,你就不能直接使用echo

您需要使用临时变量。因此,在开始日期的第一个循环中,您存储了$tmp_day_1$tmp_month_1,然后使用结束日期循环,您可以比较两个月并检查它们是否有差异。然后你可以使用echo。我希望我的观点:)

1

,以检查一种可能性,如果你需要打印一个月的当前日期的项目实际上是在下一个要检查的项目。让我试着用伪代码解释:

<?php 

    $month = 0; // Initialize $month variable to unset 

    // Loop over all your events 
    foreach($dates as $date) { 

     // Convert $date to a timestamp 

     // If the 'month' of the current $timestamp is unequal to $month 
     // it means we switch months and we have to print the $month first 
     if(date('m', $timestamp) != $month) { 

      echo $month; // Of course format how you want it to be displayed 

      // Set $month to the new month 
      $month = date('m', $timestamp); 
     } 

     // Print the rest of the event, like day numbers here 

    } 
?> 
相关问题