2013-11-04 93 views
1

我有以下函數用於獲取正確的時間並用於我的網站。 不幸的是,它不檢查夏時制並導致時間錯誤。我想知道是否有人會有一個可能的解決方案或幫我解決我的問題?PHP夏時制時間問題

我對PHP編程非常陌生,但我仍然對此很感興趣。如果有人能夠幫助我,讓它能夠在未來自動切換,這將非常有幫助。

下面是函數:

function getDSTDifference() { 
    $timezone = date_default_timezone_get(); 

    $newTZ = new DateTimeZone($timezone); 
    $trans = $newTZ->getTransitions(); 

    $offset = $trans[0]['offset'] /60 /60; 

    return $offeset; 
} 

---編輯---

爲了更好地澄清一下,我想說:

我有一個網站,呼叫監控倍。在DST和常規時間之間切換期間,這些通話時間會關閉一小時(反之亦然)。例如,這個過去的週末引起了這樣的時間:-57:01:23。而不是像現在這樣 - 我必須在每次DST和定時時間切換時手動進入並取消註釋/註釋掉兩行代碼,是否有可能的解決方案使功能能夠做到這自動?有點像更永久的解決方案。對我而言,似乎冗餘編碼必須不斷重新審視該功能,以便一次又一次地做出簡單的改變。再次,我之前沒有做過很多關於PHP代碼的工作,因此我不熟悉可以使用的函數,或者我必須自己創建這些函數。如果任何人有這方面的信息/幫助,這將是非常感激。

function getDSTDifference() { 
    $timezone = date_default_timezone_get(); 

    $NewTZ = new DateTimeZone($timezone); 
    $transition = $NewTZ->getTransitions(); 

    $offset = $transition[0]['offset'] /60 /60; 

    //The following two lines need to be commented out when it is 
    //daylight savings time 
    //They need to be uncommented when Daylight Savings Time ends 

    $dst = $transition[0]['isdst']; 
    $offset = $offset - $dst; 

    return $offset; 
} 

希望這樣做更有意義! 在此先感謝您的幫助!

+0

應該做的功能是什麼?我誠實地不能從當前的代碼中推導出它,而且你的文本描述非常模糊。 –

+0

'echo $ timezone;'的輸出是什麼? – geomagas

+2

看看這個答案=> http://stackoverflow.com/questions/1586552/how-to-tell-if-a-timezone-observes-daylight-saving-at-any-time-of-the-year – PlantTheIdea

回答

3

計算兩個給定小時之差的一種可能性是使用DateTime::diff()。在寫這個答案的時候有a PHP bug,你不得不之前轉換爲UTC:

<?php 

$zone = new DateTimeZone('Europe/Madrid'); 
$start = new DateTime('2013-03-31 1:59:00 ', $zone); 
$end = new DateTime('2013-03-31 3:00:00', $zone); 

// Workaround for bug #63953 
// No longer required since PHP/5.6.0, PHP/5.5.8 or PHP/5.4.24 
$start->setTimeZone(new DateTimeZone('UTC')); 
$end->setTimeZone(new DateTimeZone('UTC')); 

$difference = $start->diff($end); 
echo $difference->format('%H:%I:%S'); 

...打印00:01:00因爲那時DST西歐開始。

您還可以使用Unix的時間戳,這在時間代表固定時刻從而不依賴於時區:

<?php 

$zone = new DateTimeZone('Europe/Madrid'); 
$start = new DateTime('2013-03-31 1:59:00 ', $zone); 
$end = new DateTime('2013-03-31 3:00:00', $zone); 

$difference = $end->format('U') - $start->format('U'); 
echo "$difference seconds"; 

...打印60 seconds


編輯#1:你是什麼意思?我的代碼段包含示例數據,因此您可以測試它 - 在真實代碼中,您將使用真實數據。你可以(也應該)set the correct time zone as default,所以你不需要每次都指定它。但即使您不這樣做,服務器的時區也不會改變 - 即使您決定一年多次將計算機移動到另一個州或國家,您仍然可以選擇固定的時區(您的應用程序的時間區域可以不同於你的服務器)。

如果您真的想要一個解決方案,要求您每年手動更換兩次代碼(無論出於何種原因,可能要收取維護費),最好跳過日期/時間函數並使用字符串;否則你將冒PHP爲你做計算。

編輯#2:

  1. $start$end代表數據。爲了說明diff代碼正常工作,我在DST之前一分鐘選擇了樣本數據。這與您在PHP教程中看到<?php echo "Hello, World!"; ?>時的情況相同:Hello, World!是示例數據,用於說明echo的工作方式,但在編寫應用時不必使用Hello, World!

  2. GMT轉換爲EST用PHP創建屬於GMT日期:

    $date = new DateTime('14:30', new DateTimeZone('GMT')); 
    echo 'GMT: ' . $date->format('r') . PHP_EOL; 
    // GMT: Thu, 07 Nov 2013 14:30:00 +0000 
    

    ...,然後切換到EST

    $date->setTimeZone(new DateTimeZone('EST')); 
    echo 'EST: ' . $date->format('r') . PHP_EOL; 
    // EST: Thu, 07 Nov 2013 09:30:00 -0500 
    

    但是,如果你原來的日期以格林尼治標準時間爲準,將其轉換爲EST,然後減去它們不會帶來任何好處。

+0

謝謝,我非常感謝你的幫助。我唯一的後續問題是:通過設置'$ start'和'$ end'日期,這意味着我需要每年手動進入並將日期更改爲正確的DST日期。如果是這樣,是否有辦法做到這樣的事情? – scapegoat17

+0

@ scapegoat17 - 我已經編輯了我的答案,但我不太瞭解你的後續問題的含義。你有其他編程語言的經驗嗎?也許你應該解釋一下如何在其他語言中使用它,我們可以幫助你將它移植到PHP。但是我的代碼完全符合我認爲是您的要求:計算兩個日期之間的差異。如果您需要進一步澄清以瞭解其工作原理,隨時可以提出,但硬編碼DST的東西是瘋狂的,因爲PHP可以爲您做。 –

+0

我認爲我剛纔所說的可能是我們錯了。我只是想確保它不是硬編碼的,而且我不必每年都更改日期。例如,今年DST結束了「2013-11-03 2:00:00」,明年它將成爲「2013-11-02 2:00:00」,所以我必須更改'$ start'和'由於實際日期每年都在變化,因此每年的「結束日期」是?我很抱歉沒有經驗做這樣的事情......我只是想更好地理解它是如何工作的,並學習如何正確地做到這一點。爲了回答你的問題,我已經用C#/ Dot NET做了一次類似於 – scapegoat17