1

すべての日付を UTC でデータベースに保存します。Cakephp は UTC で実行され、UTC で mysql と通信します。今、私は次のシナリオを持っています:

debug(CakeTime::format('Y-m-d H:i', '2013-03-22 03:00', false,
    new DateTimeZone('Europe/Berlin')));
//output is 2013-03-22 04:00

debug(CakeTime::format('Y-m-d H:i', '2013-04-05 03:00', false,
    new DateTimeZone('Europe/Berlin')));
//output is 2013-04-05 05:00

2 番目の例で CakeTime が 2 時間のオフセットを追加したことがわかるように、これは DST (31.03.2013 から開始) を考慮しているためだと思います。
しかし、私がやろうとしているのは、定期的なイベントをカレンダーに表示することであり、このイベントは毎週金曜日の午前 4 時に開始されます。夏でも常にです。そのため、カレンダーでは午前 5 時に表示されない場合があります。

/EDIT: 最初の例は正しいです。イベントは午前 4 時に行う必要があります。でも夏にも

4

2 に答える 2

1

時間変換にこれら2つの関数を使用して問題を解決しました。
これは、DST に関係なく、常に同じ時刻 (午前 4 時など) に開始される定期的なイベント用であることに注意してください。

public function dateTimeToSever($date, $user_timezone) {
    $DateTime = new DateTime($date, $user_timezone);
    $dst = $DateTime->format('I');
    $toServerDateTime = CakeTime::toServer($date, $user_timezone, 'Y-m-d H:i');
    if ($dst) {
        $toServerDateTime = date('Y-m-d H:i', strtotime($toServerDateTime . ' + 1 Hours'));
    }
    return $toServerDateTime;
}

public function dateTimeToUser($date, $user_timezone) {
    $DateTime = new DateTime($date, new DateTimeZone('UTC'));
    $DateTime->setTimezone($user_timezone);
    $dst = $DateTime->format('I');
    $userDateTime = CakeTime::format('Y-m-d H:i', $date, false, $user_timezone);
    if ($dst) {
        $userDateTime = date('Y-m-d H:i', strtotime($userDateTime . ' - 1 Hours'));
    }
    return $userDateTime;
}

これは、正のDSTを使用するすべてのタイムゾーンで機能するはずです。私の知る限り、北インドのどこかなど、一部のタイムゾーンには、ある種ののタイムゾーンがあります。その場合、「+ 1 時間」は「- 1 時間」にならなければならないと思います。

于 2013-02-26T15:55:40.240 に答える
0

あなたの例では、どちらの場合も間違った時間を取得しています。すべての日付をUTCで保存する場合は、ユーザーがいるタイムゾーンの正しいUTC値を保存する必要があります。たとえば、ヨーロッパ/ベルリンのタイムゾーンで毎週金曜日の午後3時に繰り返し発生するイベントが必要な場合は、次に、次の手順を実行します。

// save your date like this
$date = new DateTime('2013-04-05 03:00', new DateTimeZone('Europe/Berlin'));
$utc = $date->getTimestamp();
// print them correctly like this
$utc = CakeTime::format('Y-m-d H:i', $utc, false, new DateTimeZone('Europe/Berlin'));

このアプローチの注意点として、ユーザーがタイムゾーンをDSTありからなし(またはその逆)に変更すると、同じ問題が発生する可能性があります。

于 2013-02-24T21:37:54.380 に答える