データベースに保存されている日時を「yyyy-mm-dd HH-mm-ss」として変換し、タイムゾーンに「America/Los_Angeles」を指定する方法の回避策を見つけようとしています。
タイムゾーンを変更すると、Carbonは自動的に時刻から7時間を差し引きます。これは、時刻をUTCからPSTに変更すると発生しますが、DBの時刻はPST時刻に設定されます。たとえば、今日の時刻を午前10時にしたいのですが、タイムゾーンを変更すると、Carbonはそれを今日の午前3時に変換します。
タイムゾーンがPSTに変更されても、時刻を午前10時のままにするにはどうすればよいですか? API呼び出しのタイムゾーンが必要なので、これを理解する必要があります。
わかりましたが、私がやりたかったことをするための、馬鹿ではありますが機能的な方法を見つけました。
これが私のコードです:
$dt = Carbon::parse($request->ShootDateTime)->timezone('America/Los_Angeles');
$toDay = $dt->format('d');
$toMonth = $dt->format('m');
$toYear = $dt->format('Y');
$dateUTC = Carbon::createFromDate($toYear, $toMonth, $toDay, 'UTC');
$datePST = Carbon::createFromDate($toYear, $toMonth, $toDay, 'America/Los_Angeles');
$difference = $dateUTC->diffInHours($datePST);
$date = $dt->addHours($difference);
タイムゾーンに変換したい時間を取得し、それを解析してタイムゾーンを変更します。次に、日、月、年を取得し、2つの異なる日付を作成します。どちらも時間は00:00:00と読み取られますが、この例では7時間離れているため、どちらも00:00のみにすることができます。 7時間異なる場合は00です。次にキャプチャします。最後に、最初の日時を取得し、それに差を追加して、適切なタイムゾーンで適切な時間を取得します。
醜いですが、動作します。
より良い、より簡単な方法は次のとおりです。
$carbon = new Carbon('YYYY-MM-DD HH:II:SS', 'America/Los_Angeles');
注:依存関係を追加することを忘れないでくださいuse \Carbon\Carbon;
。
あなたが探しているのはこれだと思います:
_Carbon::createFromFormat('Y-m-d H:i:s', $some_date, 'UTC')
->setTimezone('America/Los_Angeles')
_
最初に、最初に持っているタイムゾーンを設定します。そのため、データベースに日付をUTCとして保存する場合、デフォルトのタイムゾーンをUTCに設定し、次に->setTimeZone('Valid/Timezone')
を使用して、必要なものから変更します新しいタイムゾーン。
_/**
* Return the formated date based on timezone selected from sidebar nav | Front-end user | Saved in Cookie | Sent $to
*
* @param Carbon $date
* @param null $type (long | short)
* @return Carbon date
*/
public static function formatDateTimeZone($date, $type = 'long', $from = null, $to = null)
{
if (!$from)
$from = 'UTC';
if (!$to)
$to = Cookie::get('timezone_user');
$dateUTC = Carbon::now();
$datePST = Carbon::now();
$datePST->setTimezone($to);
$start = new Carbon($dateUTC);
$end = new Carbon($datePST);
$difference = $start->diffInHours($end, false); // set false to see the negative difference
$carbon = Carbon::createFromFormat('Y-m-d H:i:s', $date, $from); // specify UTC otherwise defaults to locale time zone as per ini setting
$carbon->addHours($difference);
if ($type == 'short')
{
$carbon = Carbon::parse($carbon)->format('Y-m-d');
}
return $carbon;
}
_
呼び出し:$date = Date::formatDateTimeZone(Carbon::parse('2019-11-01 06:00:00'), 'long', 'UTC', 'America/Los_Angeles');
データベースに保存された日付をUTCとしてフォーマットし、チャートに正しく表示するために、この関数を作成しました。
それは実際のタイムゾーン時間の違いを作り、古いロジックに同じロジックを適用します。 (例:違いが-7hである2019-11-04)
Laravel 5.8