5

これが可能かどうか疑問に思っていたので、次のようなモデルがあるとしましょう:

MyModel
   SomeDate - Carbon

現在、次のように現在のユーザーのタイムゾーンもあります。

User
   MyTimezone

データベースに保存されているタイムゾーンは常に UTC 形式で保存され (すべてが一貫していることを確認するため)、出力される日付は常に特定のタイムゾーンにフォーマットされている必要があります (ただし、タイムゾーンはユーザーごとに異なります)。 User2 のデンバー。

出力する前に、Carbon インスタンスごとのタイムゾーンを特定のタイムゾーンに自動的にフォーマットする方法はありますか? コレクションをループして、それに応じてそれぞれを設定する必要がありますか?

Carbon インスタンスがタイムゾーンでデータベースに保存されるため、設定app.timezoneが機能しませんが、データベース内のapp.timezoneすべての日付は UTC である必要があるため、一貫性が失われます。

現在app.timezone、アプリ構成で UTC に設定していますが、出力する前にすべての Carbon インスタンスを正しいタイムゾーンに変換する必要もあります。Carbon が文字列に変換される前に実行をトラップし、そこで実行するなど、より良い方法はありますか?

編集:

私が試したこと:

setAttribute と getAttribute をオーバーライドします。

public function setAttribute($property, $value) {
    if ($value instanceof Carbon) {
        $value->timezone = 'UTC';
    }

    parent::setAttribute($property, $value);
}

public function getAttribute($key) {
    $stuff = parent::getAttribute($key);

    if ($stuff instanceof Carbon) {
        $stuff->timezone = Helper::fetchUserTimezone();
    }

    return $stuff;
}

asDateTime のオーバーライド:

protected function asDateTime($value)
{
    // If this value is an integer, we will assume it is a UNIX timestamp's value
    // and format a Carbon object from this timestamp. This allows flexibility
    // when defining your date fields as they might be UNIX timestamps here.
    $timezone = Helper::fetchUserTimezone();

    if (is_numeric($value))
    {
        return Carbon::createFromTimestamp($value, $timezone);
    }

    // If the value is in simply year, month, day format, we will instantiate the
    // Carbon instances from that format. Again, this provides for simple date
    // fields on the database, while still supporting Carbonized conversion.
    elseif (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $value))
    {
        return Carbon::createFromFormat('Y-m-d', $value, $timezone)->startOfDay();
    }

    // Finally, we will just assume this date is in the format used by default on
    // the database connection and use that format to create the Carbon object
    // that is returned back out to the developers after we convert it here.
    elseif ( ! $value instanceof DateTime)
    {
        $format = $this->getDateFormat();

        return Carbon::createFromFormat($format, $value, $timezone);
    }

    return Carbon::instance($value);
}
4

2 に答える 2