[英]php: setting a timezone by UTC offset
使用javascript,我知道我的用戶時區為UTC +3。
現在,我想用此知識創建DateTime對象:
$usersNow = new DateTime('now', new DateTimeZone("+3"));
我得到的回應是:
'Unknown or bad timezone (+2)'
我究竟做錯了什么? 我該如何解決?
這個怎么樣...
$original = new DateTime("now", new DateTimeZone('UTC'));
$timezoneName = timezone_name_from_abbr("", 3*3600, false);
$modified = $original->setTimezone(new DateTimezone($timezoneName));
你說:
使用javascript,我知道我的用戶時區為UTC +3。
您可能會執行以下操作:
var offset = new Date().getTimezoneOffset();
這將以分鍾為單位返回當前與UTC的偏移量,正值位於UTC的西邊。 它不返回時區!
時區不是偏移量。 時區具有偏移量。 它可以具有多個不同的偏移量 。 通常有兩種偏移,一種用於標准時間,一種用於夏時制。 單個數值不能單獨表示。
"America/New_York"
UTC-5
UTC-4
除了這兩個偏移量,在該時區中還包含兩個偏移量之間轉換的日期和時間,因此您知道它們何時適用。 關於偏移和過渡如何隨時間變化也有歷史記錄。
在您的示例案例中,您可能從javascript接收到-180
的值,表示UTC + 3的當前偏移量。 但這只是該特定時間點的偏移量! 如果遵循minaz的回答 ,您將獲得一個時區,該時區假定UTC + 3 始終是正確的偏移量。 如果實時區域是"Africa/Nairobi"
東西,而UTC + 3以外的任何地方都沒有使用過,那將是可行的。 但就您所知,您的用戶可能位於"Europe/Istanbul"
,該國家在夏季使用UTC + 3,在冬季使用UTC + 2。
從PHP 5.5.10開始,DateTimeZone接受類似“ +3”的偏移量:
現代答案:
$usersNow = new DateTime('now', new DateTimeZone('+0300'));
說明文件:
對於遇到此問題的任何人,我都面臨着相同的問題,因此最終我擴展了DateTime類並覆蓋__construct()
方法以接受偏移量(以分鍾為單位)而不是時區。
從那里,我的自定義__construct()
可以算出小時和分鍾的偏移量(例如-660 = +11:00),然后使用parent::__construct()
來傳遞我的日期,自定義格式包括我的偏移量,返回原始的DateTime。
因為我一直在應用程序中處理UTC時間,所以我的班級也通過減去偏移量來修改UTC時間,因此傳遞Midnight UTC和-660的偏移量將顯示11am。
我的解決方案在這里詳細說明: https : //stackoverflow.com/a/35916440/2301484
至於我可以在文檔告訴DateTimeZone ,你需要通過一個有效的時區,這里是有效的。 檢查其他人 ,那里的東西可能會幫助您。
你嘗試過這個嗎
http://php.net/manual/zh/function.strtotime.php
<?php
echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+5 hours");
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";
?>
這一步使Matthew的答案更進一步,將日期的時區更改為任何整數偏移量。
public static function applyHourOffset(DateTime $dateTime, int $hourOffset):DateTime
{
$dateWithTimezone = clone $dateTime;
$sign = $hourOffset < 0 ? '-' : '+';
$timezone = new DateTimeZone($sign . abs($hourOffset));
$dateWithTimezone->setTimezone($timezone);
return $dateWithTimezone;
}
注意:由於接受的答案,我的產品出現了故障。
感謝Joey Rivera的鏈接,我被定向到一個解決方案。 就像其他人在這里說的一樣,時區並不是您需要有效時區的偏移量。
這就是我自己使用的
$singapore_time = new DateTime("now", new DateTimeZone('Asia/Singapore'));
var_dump( $singapore_time );
我自己發現使用YYYY-MM-DD HH:MM格式更加方便。 例。
$original = new DateTime("2017-05-29 13:14", new DateTimeZone('Asia/Singapore'));
DateTimeZone需要一個時區而不是不必要的時區
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.