php判断是否夏令时,关于php:时区和夏令时问题
我已經查看了SO上的其他解決方案,他們似乎都沒有在以下方面解決時區/ dst問題。
我正在調用NOAA Tide Prediction API和NOAA國家氣象服務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。
您可以傳遞"now"來接收當前日期和時間的值,而不是在date_create的調用中指定時間。
但是,如同喬恩所提到的,同一時區內的不同國家可以觀察到夏令時,而其他國家可能沒有。
但是,請注意這些問題。 bugs.php.net/bug.php?id=40743 bugs.php.net/bug?php?id=49914 bugs.php.net/bug.php?id=51051 bugs.php.net/bug.php?id = 51557 bugs.php.net/bug.php?id=52480 bugs.php.net/bug.php?id=54340 bugs.php.net/bug.php?id=54655 bugs.php.net/bug.php ?id = 55253 bugs.php.net/bug.php?id=60873 bugs.php.net/bug.php?id=60960 bugs.php.net/bug.php?id=61022 bugs.php.net/bug .php?id = 61311 bugs.php.net/bug.php?id=61530 bugs.php.net/bug.php?id=61955
^我的上帝.........
For each location in my database, I have the timezone as a UTC offset and whether daylight savings time is observed (either 1 or 0).
這還不夠信息。可以有多個時區都具有相同的標準偏移,都觀察到DST,但是在不同時間執行DST轉換。 (事實上??,從歷史上看,他們也可能會開始和停止觀察夏令時數年。)
基本上,您的數據庫應包含時區ID,而不是offset / DST-true-or-false。 (假設PHP使用zoneinfo時區數據庫,則時區ID類似于"Europe / London"。)
編輯:要查找給定DateTime的偏移量,可以調用getOffset,然后可以將其與標準時間偏移進行比較。但除非您擁有明確的時區ID,否則您將面臨錯誤區域的風險。
函數timezone_name_from_abbr("", $locationdata->timezone * 3600, false);從偏移量返回時區ID,因此-5可能會返回'America / New York`。
@cillosis:你是否依賴這種映射是準確的?因為它會含糊不清。雖然會編輯回答具體問題...
我確信會有歧義,但此刻我并不擔心。我更關心的是確定一個區域目前是否正在觀察夏令時。
@cillosis:很難知道如果你不知道你真正感興趣的是哪個區域......但正如我所說,你可以在DateTime上調用getOffset來查找。
您可以使用cron作業使tzdata(以及DST)定義保持最新,以便經常更新此PECL包:pecl.php.net/package/timezonedb
Cillosis,
我希望你不使用Java!我和時間一直在戰斗。我也使用天氣數據。我使用的大部分數據都是在本地標準時間內(忽略夏令時)。我還需要使用其他時區的時間,發現Java一直在讀取計算機的時區。我也一直在運行已棄用的課程。我提出了一個有效的解決方案。它有點像kluge,所以我有大量記錄,它只存在于一個函數中。我的解決方案是相對時間。我已將當地時間設置為UTC。我正在減去GMT偏移而不是添加它。我真的不關心實際的時間,我關心的是兩次之間的區別。它工作得很好。
祝好運
我正在使用PHP并最終實現了類似的解決方案。
總結
以上是生活随笔為你收集整理的php判断是否夏令时,关于php:时区和夏令时问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 非连续传输 DTX
- 下一篇: php 抓取百度快照时间,php获取网站