php判断是否夏令时,关于php:时区和夏令时问题
我已經(jīng)查看了SO上的其他解決方案,他們似乎都沒有在以下方面解決時區(qū)/ dst問題。
我正在調(diào)用NOAA Tide Prediction API和NOAA國家氣象服務(wù)API,要求通過時間范圍來檢索數(shù)據(jù)。 對于我的數(shù)據(jù)庫中的每個位置,我將時區(qū)作為UTC偏移量以及是否觀察到夏令時(1或0)。 我正在嘗試將某些日期(今天和明天)格式化為LST(本地標準時間)將在其自己的時區(qū)中,因此我可以傳遞給這些API。
我無法弄清楚如何知道日期(例如今天)是否在夏令時范圍內(nèi)。
這是我到目前為止:
// 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的時間和日期函數(shù):
$tzObj = timezone_open($tz_name);
$dateObj = date_create("07.03.2012 10:10:10", $tzObj);
$dst_active = date_format($dateObj,"I");
如果DST在給定日期處于活動狀態(tài),則$dst_active為1,否則為0。
您可以傳遞"now"來接收當前日期和時間的值,而不是在date_create的調(diào)用中指定時間。
但是,如同喬恩所提到的,同一時區(qū)內(nèi)的不同國家可以觀察到夏令時,而其他國家可能沒有。
但是,請注意這些問題。 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).
這還不夠信息。可以有多個時區(qū)都具有相同的標準偏移,都觀察到DST,但是在不同時間執(zhí)行DST轉(zhuǎn)換。 (事實上??,從歷史上看,他們也可能會開始和停止觀察夏令時數(shù)年。)
基本上,您的數(shù)據(jù)庫應包含時區(qū)ID,而不是offset / DST-true-or-false。 (假設(shè)PHP使用zoneinfo時區(qū)數(shù)據(jù)庫,則時區(qū)ID類似于"Europe / London"。)
編輯:要查找給定DateTime的偏移量,可以調(diào)用getOffset,然后可以將其與標準時間偏移進行比較。但除非您擁有明確的時區(qū)ID,否則您將面臨錯誤區(qū)域的風險。
函數(shù)timezone_name_from_abbr("", $locationdata->timezone * 3600, false);從偏移量返回時區(qū)ID,因此-5可能會返回'America / New York`。
@cillosis:你是否依賴這種映射是準確的?因為它會含糊不清。雖然會編輯回答具體問題...
我確信會有歧義,但此刻我并不擔心。我更關(guān)心的是確定一個區(qū)域目前是否正在觀察夏令時。
@cillosis:很難知道如果你不知道你真正感興趣的是哪個區(qū)域......但正如我所說,你可以在DateTime上調(diào)用getOffset來查找。
您可以使用cron作業(yè)使tzdata(以及DST)定義保持最新,以便經(jīng)常更新此PECL包:pecl.php.net/package/timezonedb
Cillosis,
我希望你不使用Java!我和時間一直在戰(zhàn)斗。我也使用天氣數(shù)據(jù)。我使用的大部分數(shù)據(jù)都是在本地標準時間內(nèi)(忽略夏令時)。我還需要使用其他時區(qū)的時間,發(fā)現(xiàn)Java一直在讀取計算機的時區(qū)。我也一直在運行已棄用的課程。我提出了一個有效的解決方案。它有點像kluge,所以我有大量記錄,它只存在于一個函數(shù)中。我的解決方案是相對時間。我已將當?shù)貢r間設(shè)置為UTC。我正在減去GMT偏移而不是添加它。我真的不關(guān)心實際的時間,我關(guān)心的是兩次之間的區(qū)別。它工作得很好。
祝好運
我正在使用PHP并最終實現(xiàn)了類似的解決方案。
總結(jié)
以上是生活随笔為你收集整理的php判断是否夏令时,关于php:时区和夏令时问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 非连续传输 DTX
- 下一篇: 面经 - OpenStack(Docke