2013-02-27 65 views
0

我需要爲用戶提供一種選擇將來幾天(包括今天)的上午11點和下午4點的時間段,共有8個選項。當然,如果它已經過了上午11點或下午4點,那麼我不應該向他們展示過期選項。使用PHP/MySQL計算和存儲將來的時間和日期

因此,舉例來說,如果它是目前中午在2月28日,那我就需要向用戶顯示以下8個選項:

28-Feb-13 at 4pm 
01-Mar-13 at 11am 
01-Mar-13 at 4pm 
02-Mar-13 at 11am 
02-Mar-13 at 4pm 
03-Mar-13 at 11am 
03-Mar-13 at 4pm 
04-Mar-13 at 11am 

而且,我需要一種方法來存儲這些選項在MySQL中,以便我現在選擇哪個日期/時間並將它們與其註冊信息一起保存到DB中。

這聽起來很容易用語言來解釋,但我有一個難以置信的困難時間搞清楚如何在PHP中編程。

如何使用DateTime()類來做到這一點?

+0

檢查當前時間和寫conditions..ie,如果當前時間<11點或當前時間<4時再做以下幾點 – 2013-02-27 12:16:08

+0

@用戶:我如何檢查它是<上午11點還是<下午4點?我如何顯示明天上午11點和下午4點以及接下來的幾天?我如何在MySQL中存儲選定的時間? – ProgrammerGirl 2013-02-27 12:25:27

+0

是週末考慮?假期? – SparKot 2013-02-27 12:26:03

回答

0
<?php 

$hours = array(11,16); 
$outputCount = 8; 

$now = new DateTime(); 
$t = clone $now; 

$dates = array(); 
$i=0; 

while (count($dates)<$outputCount) { 
    $t->setTime($hours[++$i % count($hours)],0,0); 
    if ($t>$now) { 
     $dates[] = clone $t; 
    } 
    if ($t->format('G') == max($hours)) { 
     $t->modify('+1 day'); 
    } 
} 

print_r($dates); 
+0

非常有趣和簡潔的解決方案,謝謝!幾個問題:** 1)**我如何設置此代碼以在特定時區工作? ** 2)**如果不是下午4點,我需要下午4點半,我該怎麼做? ** 3)**我應該如何使用正確的時區在MySQL中保存這些時間/日期? – ProgrammerGirl 2013-02-27 13:41:01

+0

您可以在php.ini文件中設置時區或在開始處的$ now對象上覆蓋它。您必須創建一個$ minutes數組,其大小與您從$ i中取出數據的$ hours數組相同。 MySQL不會記錄時區,只是一段時間。如果您希望不同的用戶在不同的時區查看日期,則必須在前端處理日期,並將所有後端數據的存儲標準化爲單個時區。 – 2013-02-27 17:09:57

0

請嘗試以下代碼,我會在數據庫存儲爲DATETIME: 它是由您根據您的需要優化,它應該給你的邏輯的基本思想:

<?php 
    $end_date = mktime(0, 0, 0, date("m") , date("d")+4, date("Y")); 
    $cnt = 0; 
    $day = 0; 

    $current_hour = date("H"); 
    // To test with various values, uncomment below line and assign any hour 
    // $current_hour = "12"; 


    if($current_hour < 11) 
    { 
     $day = 0; 
     $ts = mktime(11, 0, 0, date("m") , date("d"), date("Y")); 
     echo "<br>".date("Y-m-d H:i:s",$ts); 
     $ts = mktime(16, 0, 0, date("m") , date("d"), date("Y")); 
     echo "<br>".date("Y-m-d H:i:s",$ts); 
     $cnt = 2; 
     $day = $day + 1; 
    } 
    elseif($current_hour < 16) 
    { 
     $day = 0; 
     $ts = mktime(16, 0, 0, date("m") , date("d")+$day, date("Y")); 
     echo "<br>".date("Y-m-d H:i:s",$ts); 
     $cnt = 1; 
     $day = $day + 1; 
    } 
    elseif($current_hour >= 16) 
    { 

     $day = $day + 1; 
    } 


    while($cnt <= 8) 
    { 
     $ts = mktime(11, 0, 0, date("m") , date("d")+$day, date("Y")); 
     echo "<br>".date("Y-m-d H:i:s",$ts); 
     $cnt = $cnt + 1; 
     if($cnt >=8) break; 

     $ts = mktime(16, 0, 0, date("m") , date("d")+$day, date("Y")); 
     echo "<br>".date("Y-m-d H:i:s",$ts);  
     $cnt = $cnt + 1; 
     $day = $day + 1; 
     if($cnt >=8) break; 
    } 

    ?> 
0

你只需要創建一個「現在」的日期時間,然後檢查你是否在上午11點之前,然後決定將你的小時移動到上午11點或下午4點,然後增加以檢索你的8個值。

下面是一段代碼,可以處理這些東西:

// create a "now" date time 
$now = new DateTime(); 

// create a "now at 11am" date time 
$nowAt11am = new DateTime(); 
$nowAt11am->setTime(11, 0, 0); 

// Compare the interval between now and now at 11am 
$interval = $now->diff($nowAt11am); 

// Initialize the increment even/odd 
$incementEvenOdd = 0; 

// Check interval 
if ($interval->invert == 1) 
{ 
    // $interval < 0 => we are before $nowAt11am, set to 11 am 
    $now = $nowAt11am; 
    $incementEvenOdd = 0; 
} 
else 
{ 
    // $interval > 0 => we are after $nowAt11am, set to 4 pm 
    $now->setTime(16, 0, 0); 
    $incementEvenOdd = 1; 
} 

$dayAndHours = array(); 
$dayAndHours[] = $now->format("your_desire_format"); 

// Loop and add the next 7 dates 
for($i = 0 ; $i < 7 ; $i++) 
{ 
    // Handle the delay between 11 am and 4 pm 
    // 11am -> 4pm = + 5h 
    // 4pm -> 11am = + 19h 

    if ($incementEvenOdd % 2 == 0) 
     $now->add(DateInterval::createFromDateString('5 hours')); 
    else 
     $now->add(DateInterval::createFromDateString('19 hours')); 

    // Appen the next value 
    $dayAndHours[] = $now->format("your_desire_format"); 

    // Update increment 
    $incrementEvenOdd++; 
} 
+0

非常有趣,謝謝。你的代碼中有一個錯誤的變量「incementEvenOdd」和「incRementEvenOdd」,但除此之外,它的工作原理!幾個問題:** 1)**我如何設置此代碼在**特定時區**上工作? ** 2)**如果不是5個小時,我需要增加** 5個半小時**來使下午時間** 4:30 pm**,我該怎麼做? ** 3)**我應該如何在MySQL中保存這些時間/日期? – ProgrammerGirl 2013-02-27 12:53:09

+0

1)看看DateTime類:http://www.php.net/manual/en/class.datetime.php。你可以在構造函數中給出一個時區。 2)在這裏查看'DateInterval :: createFromDateString'的可用格式列表:http://www.php.net/manual/en/datetime.formats.relative.php。我認爲你可以使用'DateInterval :: createFromDateString('5小時30分鐘')'。 3)創建所有「日期」後,可以使用SQL請求插入它們。 4)投票或標記爲解決方案,如果它適合U;) – MatRt 2013-02-27 21:30:22

相關問題