web-dev-qa-db-ja.com

Laravelカーボン時を変更せずにタイムゾーンを変更する方法

データベースに保存されている日時を「yyyy-mm-dd HH-mm-ss」として変換し、タイムゾーンに「America/Los_Angeles」を指定する方法の回避策を見つけようとしています。

タイムゾーンを変更すると、Carbonは自動的に時刻から7時間を差し引きます。これは、時刻をUTCからPSTに変更すると発生しますが、DBの時刻はPST時刻に設定されます。たとえば、今日の時刻を午前10時にしたいのですが、タイムゾーンを変更すると、Carbonはそれを今日の午前3時に変換します。

タイムゾーンがPSTに変更されても、時刻を午前10時のままにするにはどうすればよいですか? API呼び出しのタイムゾーンが必要なので、これを理解する必要があります。

6
Eric Brown

わかりましたが、私がやりたかったことをするための、馬鹿ではありますが機能的な方法を見つけました。

これが私のコードです:

      $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です。次にキャプチャします。最後に、最初の日時を取得し、それに差を追加して、適切なタイムゾーンで適切な時間を取得します。

醜いですが、動作します。

2
Eric Brown

より良い、より簡単な方法は次のとおりです。

$carbon = new Carbon('YYYY-MM-DD HH:II:SS', 'America/Los_Angeles');

注:依存関係を追加することを忘れないでくださいuse \Carbon\Carbon;

5
Abhishek Sachan

あなたが探しているのはこれだと思います:

_Carbon::createFromFormat('Y-m-d H:i:s', $some_date, 'UTC')
    ->setTimezone('America/Los_Angeles')
_

最初に、最初に持っているタイムゾーンを設定します。そのため、データベースに日付をUTCとして保存する場合、デフォルトのタイムゾーンをUTCに設定し、次に->setTimeZone('Valid/Timezone')を使用して、必要なものから変更します新しいタイムゾーン。

4
AfikDeri
_/**
 * 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

0
Alex Ciocan