[英]Timezone and Daylight Savings Issues
我已經瀏覽了SO上的其他解決方案,但它們似乎都沒有在以下方面解決時區/ dst問題。
我正在撥打NOAA潮汐預報API和NOAA國家氣象服務API的電話 ,這些API需要傳遞時間范圍才能檢索數據。 對於數據庫中的每個位置,我都有時區作為UTC偏移量,以及是否觀察到夏令時(1或0)。 我正在嘗試將某些日期(今天和明天)格式化為LST(本地標准時間)在其自己的時區中的格式,以便我可以傳遞給這些API。
我在弄清楚如何知道某個日期(例如今天)是否在夏令時范圍內時遇到了麻煩。
這是我到目前為止的內容:
// Get name of timezone for tide station
// NOTE: $locationdata->timezone is something like "-5"
$tz_name = timezone_name_from_abbr("", $locationdata->timezone * 3600, false);
$dtz = new DateTimeZone($tz_name);
// Create time range
$start_time = new DateTime('', $dtz);
$end_time = new DateTime('', $dtz);
$end_time = $end_time->modify('+1 day');
// Modify time to match local timezone
$start_time->setTimezone($dtz);
$end_time->setTimezone($dtz);
// Adjust for daylight savings time
if( $locationdata->dst == '1' )
{
// DST is observed in this area.
// ** HOW DO I KNOW IF TODAY IS CURRENTLY DST OR NOT? **
}
// Make call to API using modified time range
...
我該怎么做呢? 謝謝。
您可以使用PHP的時間和日期函數:
$tzObj = timezone_open($tz_name);
$dateObj = date_create("07.03.2012 10:10:10", $tzObj);
$dst_active = date_format($dateObj, "I");
如果DST在給定日期處於活動狀態,則$dst_active
為1
,否則為0
。
除了在對date_create
的調用中指定時間date_create
您還可以傳遞"now"
以接收當前日期和時間的值。
但是,就像喬恩提到的那樣,在相同時區偏移量內的不同國家/地區可能會遵守夏令時,而其他國家可能不會。
對於數據庫中的每個位置,我都有時區作為UTC偏移量,以及是否觀察到夏令時(1或0)。
信息不足。 可能存在多個時區,所有時區都具有相同的標准偏移,都遵守DST,但在不同時間執行DST轉換。 (實際上,從歷史上看,它們可能也開始和停止了幾年的夏時制。)
基本上,您的數據庫應包含時區ID,而不應包含offset / DST-true-或-false。 (假設PHP使用zoneinfo時區數據庫,則時區ID類似於“歐洲/倫敦”。)
編輯:要查找給定DateTime
的偏移量,可以調用getOffset
,然后可以將其與標准時間偏移量進行比較。 但是,除非您具有確定的時區ID,否則您將冒獲得錯誤時區的風險。
Cillosis,希望您不使用Java! 我一直在和時間斗爭。 我也處理天氣數據。 我使用的大多數數據都以當地標准時間顯示(忽略夏令時)。 我還需要使用其他時區的時間,並且發現Java一直在讀取計算機的時區。 我也一直遇到過時的類。 我想出了一個可行的解決方案。 它有點混亂,所以我有大量文獻記錄,它僅存在於一個函數中。 我的解決方案是相對時間。 我已將當地時間設置為UTC。 我減去GMT偏移量而不是添加它。 我並不在乎實際時間,我所關心的只是兩次之間的時差。 運行良好。 祝好運
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.