6

イベントの日付に奇妙な問題があり、修正しようと懸命に努力しましたが、修正できませんでした。

ページに日付を表​​示する方法のスクリーンショットを添付しています。 ここに画像の説明を入力

写真はアクションの最初のイベント Deine Energie です! は 5 つのイベントの組み合わせで、各イベントには開始日と終了日があります。

イベントの最初の部分は、4 月 4 日に始まり、4 月 4 日に終わる 1 日のイベントです。同様に第2部は4月7日、第3部は4月9日、第4部は4月20日です。

最後の部分は 5 月 5 日に始まり、5 月 10 日に終わります。

日付はこの形式でデータベースに保存されます: イベントの最後の部分の日付を表示しています。イベント開始日: 2013-05-05 00:00:00 イベント終了日: 2013-05-10 00:00:00

だから私は写真に示されている形式で日付を表示したい。

複数のケースがあります: 1 つ目は、すべての日付が 1 か月以内に来る場合、最後に月名を 1 回だけ表示します。2 つ目は、月が変更された場合、月が変更された日付の後に月名が表示されることです。

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

3 に答える 3

4

最も簡単なのは、最初にクエリからすべてのデータを配列などに収集することです。

その後、配列を反復処理します。すべてのデータをまとめると、連続する 2 つの日付範囲を比較して、それぞれについて印刷する必要がある詳細レベルを決定できます。

コメント付きの例:

// 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/>
于 2013-04-18T09:30:34.493 に答える
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

    }
?>
于 2013-04-18T09:23:58.110 に答える