はじめまして。新卒で入社し、2年目に入った遠藤です。
Carbonでのタイムゾーン変更方法について記載します。
タイムゾーンの異なる日時との出会い
開発中に、日本時間(JST)ではないタイムゾーンの日時でデータを飛ばしてくるPayPalのWebhookに出会いました。
PayPalから来るWebhookには以下の2つのタイムゾーンのデータがありました。
・PST 米国太平洋標準時 例)’03:00:00 April 14, 2022 PST’
・PDT 米国太平洋標準時(夏時間) 例)’03:00:00 April 14, 2022 PDT’
最初は、以下のように実装しようとしてました。
1 2 3 4 5 6 7 8 9 10 |
$dateTime = '03:00:00 April 14, 2022 PST' if( strpos( $dateTime , 'PST' ) !== false ) { $dateTime->addHours(17); } elseif( strpos( $dateTime , 'PDT' ) !== false ) { $dateTime->addHours(16); } |
タイムゾーン変更メソッド
しかし、Carbonには便利なメソッドがあり簡単にタイムゾーン対応ができました。
1 2 3 4 5 6 7 8 9 10 11 |
// PSTの場合 $dateTime = '03:00:00 April 14, 2022 PST' $dateTime = Carbon::parse( $dateTime )->timezone('Asia/Tokyo'); print( $dateTime ); // 2022-04-14 20:00:00 が出力される // PDTの場合 $dateTime = '03:00:00 April 14, 2022 PDT' $dateTime = Carbon::parse( $dateTime )->timezone('Asia/Tokyo'); print( $dateTime ); // 2022-04-14 19:00:00 が出力される |
どんなタイムゾーンの日時が来たとしてもいい感じに日本時間に変換してくれました。
以下のように、config/app.phpのタイムゾーン設定は’Asia/Tokyo’だけど、’PDT’等他のタイムゾーンに変更したい時でも、timezoneメソッドで対応できます。
1 2 3 |
$dateTime = Carbon::now(); // 2022-04-26 18:31:37 $dateTime = Carbon::parse( $dateTime )->timezone('PST'); print( $dateTime ); // 2022-04-26 01:31:37 が出力される |