# JS 時區轉換 ###### tags: `javascript` js 轉換時區常用套件 [luxon](https://github.com/moment/luxon) 處理,記錄一下常用的使用方式 ## 設定時間跟時區 `DateTime` 類別 `DateTime` 初始化可傳入一個時間,並告訴它 Time Zone 是什麼 ```javascript= const { DateTime } = require('luxon'); let dateTime = DateTime.fromSQL('2022-01-10 12:00:00', { zone: 'Asia/Taipei'}); ``` `dateTime` 物件就代表台北時間 `2022-01-10 12:00:00`,如果沒有特別指定時間,預設是當下,如果沒有特別指定時區,就看 js 所在系統預設的時區,另外也可以使用 UTC 加減時間表示,例如 UTC +8 時區可用 `{ zone: '+0800 }'` 表示、UTC -4 時區可用 `{ zone: '-0400' }` 表示 ## 轉換時區使用 `setZone` method 把本地預設時區現在轉成紐約時區的時間 ```javascript= const { DateTime } = require('luxon'); DateTime.setZone('America/New_York').toFormat('yyyy-LL-dd HH:mm:ss'); ``` 把本地預設時區 `2022-01-10 12:00:00` 轉成紐約時區的時間 ```javascript= const { DateTime } = require('luxon'); let dateTime = DateTime.fromSQL('2022-01-10 12:00:00').setZone('America/New_York').toFormat('yyyy-LL-dd HH:mm:ss'); ``` 把台北時區現在轉成紐約時區的時間 ```javascript= const { DateTime } = require('luxon'); let dateTime = DateTime.local({ zone: 'Asia/Taipei'}).setZone('America/New_York').toFormat('yyyy-LL-dd HH:mm:ss'); ``` 把台北時區 `2022-01-10 12:00:00` 轉成紐約時區的時間 ```javascript= const { DateTime } = require('luxon'); let dateTime = DateTime.fromSQL('2022-01-10 12:00:00', { zone: 'Asia/Taipei'}).setZone('America/New_York').toFormat('yyyy-LL-dd HH:mm:ss'); //2022-01-09 23:00:00 ``` 歐美多數地區都有夏令時區,冬天相差夏天一小時,例如紐約在冬天會是 `UTC-5`,夏天則是 `UTC-4` ```javascript= const { DateTime } = require('luxon'); let dateTime = DateTime.fromSQL('2022-06-10 12:00:00', { zone: 'Asia/Taipei'}).setZone('America/New_York').toFormat('yyyy-LL-dd HH:mm:ss'); //2022-06-10 00:00:00 ``` ## 取得 unix timestamp 使用 `toSeconds` 取得本地預設時區 `2022-01-10 12:00:00` 的 unix timestamp ```javascript= const { DateTime } = require('luxon'); DateTime.fromSQL('2022-01-10 12:00:00').toSeconds(); ``` 取得台北時區 `2022-01-10 12:00:00` 的 unix timestamp ```javascript= const { DateTime } = require('luxon'); let dateTime = DateTime.fromSQL('2022-01-10 12:00:00', { zone: 'Asia/Taipei'}).toSeconds(); ``` 取得紐約時區 `2022-01-10 12:00:00` 的 unix timestamp ```javascript= const { DateTime } = require('luxon'); let dateTime = DateTime.fromSQL('2022-01-10 12:00:00', { zone: 'America/New_York'}).toSeconds(); ``` 備註說明: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 轉成某時區的時間使用 `fromSeconds` + `toFormat` 將 timestamp 1656604800 轉成本地預設時區時間 ```javascript= const { DateTime } = require('luxon'); let dateTime = DateTime.fromSeconds(1656604800).toFormat('yyyy-LL-dd HH:mm:ss')(); ``` 將 timestamp 1656604800 轉成台北時區時間 ```javascript= const { DateTime } = require('luxon'); let dateTime = DateTime.fromSeconds(1656604800).setZone('Asia/Taipei').toFormat('yyyy-LL-dd HH:mm:ss')(); //2022-07-01 00:00:00 ``` 將 timestamp 1656604800 轉成紐約時區時間 ```javascript= const { DateTime } = require('luxon'); let dateTime = DateTime.fromSeconds(1656604800).setZone('America/New_York').toFormat('yyyy-LL-dd HH:mm:ss')(); //2022-06-30 12:00:00 ```