簡體   English   中英

PHP:通過UTC偏移量設置時區

[英]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

除了這兩個偏移量,在該時區中還包含兩個偏移量之間轉換的日期和時間,因此您知道它們何時適用。 關於偏移和過渡如何隨時間變化也有歷史記錄。

另請參見時區標簽Wiki “時區!=偏移”。

在您的示例案例中,您可能從javascript接收到-180的值,表示UTC + 3的當前偏移量。 但這只是該特定時間點的偏移量! 如果遵循minaz的回答 ,您將獲得一個時區,該時區假定UTC + 3 始終是正確的偏移量。 如果實時區域是"Africa/Nairobi"東西,而UTC + 3以外的任何地方都沒有使用過,那將是可行的。 但就您所知,您的用戶可能位於"Europe/Istanbul" ,該國家在夏季使用UTC + 3,在冬季使用UTC + 2。

從PHP 5.5.10開始,DateTimeZone接受類似“ +3”的偏移量:

https://3v4l.org/NUGSv

現代答案:

$usersNow = new DateTime('now', new DateTimeZone('+0300'));

說明文件:

http://php.net/manual/en/datetimezone.construct.php

對於遇到此問題的任何人,我都面臨着相同的問題,因此最終我擴展了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM