# PHP 時區轉換 ###### tags: `PHP` PHP 時區轉換常用 [`DateTime`](https://www.php.net/manual/en/class.datetime.php) 處理,記錄一下常用的使用方式 ## 設定時間跟時區 `DateTime` 類別 `DateTime` 初始化可傳入一個時間,並告訴它 DateTimeZone 是什麼 ```php= $dateTime = new DateTime('2022-01-10 12:00:00', new DateTimeZone('Asia/Taipei')); ``` `$dateTime` 物件就代表台北時間 `2022-01-10 12:00:00`,如果沒有特別指定時間,預設是當下,如果沒有特別指定時區,就看 PHP 所在系統預設的時區,另外初始化 `DateTimeZone` 除了輸入特定城市的時區外,也可以使用 UTC 加減時間表示,例如 UTC +8 時區可用 `new DateTimeZone('+0800')` 表示、UTC -4 時區可用 `new DateTimeZone('-0400')` 表示 ## 轉換時區使用 `setTimezone` method 把本地預設時區現在轉成紐約時區的時間 ```php= $dateTime = new DateTime(); $dateTime->setTimezone(new DateTimeZone('America/New_York')->format('Y-m-d H:i:s'); ``` 把本地預設時區 `2022-01-10 12:00:00` 轉成紐約時區的時間 ```php= $dateTime = new DateTime('2022-01-10 12:00:00'); $dateTime->setTimezone(new DateTimeZone('America/New_York'))->format('Y-m-d H:i:s'); ``` 把台北時區現在轉成紐約時區的時間 ```php= $dateTime = new DateTime('now', new DateTimeZone('Asia/Taipei')); $dateTime->setTimezone(new DateTimeZone('America/New_York')->format('Y-m-d H:i:s'); ``` 把台北時區 `2022-01-10 12:00:00` 轉成紐約時區的時間 ```php= $dateTime = new DateTime('2022-01-10 12:00:00', new DateTimeZone('Asia/Taipei')); $dateTime->setTimezone(new DateTimeZone('America/New_York'))->format('Y-m-d H:i:s'); //2022-01-09 23:00:00 ``` 歐美多數地區都有夏令時區,冬天相差夏天一小時,例如紐約在冬天會是 `UTC-5`,夏天則是 `UTC-4` ```php= $dateTime = new DateTime('2022-06-10 12:00:00', new DateTimeZone('Asia/Taipei')); $dateTime->setTimezone(new DateTimeZone('America/New_York'))->format('Y-m-d H:i:s'); //2022-06-10 00:00:00 ``` ## 取得 unix timestamp 使用 `getTimestamp` 取得本地預設時區 `2022-01-10 12:00:00` 的 unix timestamp ```php= $dateTime = new DateTime('2022-01-10 12:00:00'); $dateTime->getTimestamp(); //等同於 strtotime('2022-01-10 12:00:00'); ``` 取得台北時區 `2022-01-10 12:00:00` 的 unix timestamp ```php= $dateTime = new DateTime('2022-01-10 12:00:00', new DateTimeZone('Asia/Taipei')); $dateTime->getTimestamp(); ``` 取得紐約時區 `2022-01-10 12:00:00` 的 unix timestamp ```php= $dateTime = new DateTime('2022-01-10 12:00:00', new DateTimeZone('America/New_York')); $dateTime->getTimestamp(); ``` 備註說明:Unix timestamp 定義為從格林威治時間1970年01月01日00時00分00秒至現在的總秒數,不管任何時區同一刻的 timestamp 會是一樣的。以台北-紐約一月相差 13 小時為例,台北時區 `2022-01-10 12:00:00` 的 unix timestamp 對應的紐約時區時間是 `2022-01-09 23:00:00`,因為台北時區時間 `2022-01-10 12:00:00` 這一刻的紐約時區時間是 `2022-01-09 23:00:00`。而紐約時區 `2022-01-10 12:00:00` 的 unix timestamp 對應的台北時區時間是 `2022-01-11 01:00:00` ## 將 timestamp 轉成某時區的時間使用 `setTimestamp` + `format` 將 timestamp 1656604800 轉成本地預設時區時間 ```php= $dateTime = new DateTime() $dateTime->setTimestamp(1656604800)->format('Y-m-d H:i:s') ``` 將 timestamp 1656604800 轉成台北時區時間 ```php= $dateTime = new DateTime() $dateTime->setTimezone(new DateTimeZone('Asia/Taipei'))->setTimestamp(1656604800)->format('Y-m-d H:i:s') //2022-07-01 00:00:00 ``` 將 timestamp 1656604800 轉成紐約時區時間 ```php= $dateTime = new DateTime() $dateTime->setTimezone(new DateTimeZone('America/New_York'))->setTimestamp(1656604800)->format('Y-m-d H:i:s') //2022-06-30 12:00:00 ```