Cakephp CakeTime DST处理

Cakephp CakeTime DST处理,cakephp,date,time,timezone,dst,Cakephp,Date,Time,Timezone,Dst,我将所有日期以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',

我将所有日期以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
正如您在第二个示例中看到的,CakeTime增加了2小时的偏移量,我想这是因为它考虑了DST(从2013年3月31日开始)。
然而,我试图做的是在日历中显示重复发生的事件,这个事件从每一个星期五的凌晨4点开始——总是这样,即使在夏天也是如此。因此,日历可能不会显示为凌晨5点


/编辑:第一个例子是corret。活动必须在凌晨4点举行。但同样在夏天

在你的例子中,你在这两种情况下都得到了错误的时间。如果要以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的时区更改为无DST的时区(反之亦然),他们可能会遇到相同的问题。

在您的示例中,两种情况下的时间都是错误的。如果要以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的时区更改为无DST的时区(反之亦然),他们可能会遇到相同的问题。

我使用这两个时间转换函数解决了问题。
请记住,这适用于反复发生的事件,无论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的时区。AFAIK一些时区,例如印度北部的某个地方,有某种负时区。我想在这种情况下,“+1小时”必须变成“-1小时”,反之亦然。

我使用这两个函数来转换时间,解决了这个问题。
请记住,这适用于反复发生的事件,无论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的时区。AFAIK一些时区,例如印度北部的某个地方,有某种负时区。我想在这种情况下,“+1小时”必须变成“-1小时”,反之亦然。

您是否使用了
date\u default\u timezone\u set('UTC')
Configure::write('Config.timezone','UTC')
是否使用了
date\u default\u timezone\u set('UTC')
Configure::write('Config.timezone','UTC')有吗?我用另一种方式存储它。为什么它不应该这样工作?CakeTime::toServer('2013-03-22 03:00',$this->Auth->user('timezone')使用CakeTime::toServer将日期时间转换为可能不是UTC的服务器时区。但是我有日期\默认\时区\设置('UTC')、配置::写入('Config.timezone','UTC')和$this->查询('set time \ u zone='+00:00')。因此,我的蛋糕和服务器应该以UTC运行,而toServer()应该正确地将其转换为UTC。我想是的!问题只是DST。我用另一种方式存储它。为什么它不应该这样工作?CakeTime::toServer('2013-03-22 03:00',$this->Auth->user('timezone')使用CakeTime::toServer将日期时间转换为可能不是UTC的服务器时区。但是我有日期\默认\时区\设置('UTC')、配置::写入('Config.timezone','UTC')和$this->查询('set time \ u zone='+00:00')。因此,我的蛋糕和服务器应该以UTC运行,而toServer()应该正确地将其转换为UTC。我想是的!问题只是DST。