Php 更改时间戳取决于用户';在卡基的国家3

Php 更改时间戳取决于用户';在卡基的国家3,php,cakephp,timezone,cakephp-3.0,Php,Cakephp,Timezone,Cakephp 3.0,我想更改国家的时区,这样当用户删除一个对象时,我可以将$timestamp从用户的国家设置为与该对象相关的行 我在控制器中调用一个函数,如下所示: $turno = $this->Turnos->get($id); $countryid= $this -> Auth -> User()['countryid']; $datos = getHoraDiaMesAnio($countryid); $fechaActual = date('Y-m-d',st

我想更改国家的时区,这样当用户删除一个对象时,我可以将$timestamp从用户的国家设置为与该对象相关的行

我在控制器中调用一个函数,如下所示:

 $turno = $this->Turnos->get($id);

    $countryid= $this -> Auth -> User()['countryid'];
$datos = getHoraDiaMesAnio($countryid);
    $fechaActual = date('Y-m-d',strtotime($datos[2]."-".$datos[1]."-".$datos[0]));
    $dia = $datos[0];   $mes = $datos[1];   $anio = $datos[2];
    $horaActual = date('H:i',strtotime($datos[4]));

    $hora = $datos[5];
    $timestamp = $anio."-".$mes."-".$dia." ".$hora;

    $turno->fechaBaja = $timestamp;
    //$turno->fechaBaja = $result;
    if ($this->Turnos->save($turno)) {
        $this->Flash->success(__('El turno se ha eliminado.'));
    } else {
        $this->Flash->error(__('El turno no se ha podido eliminar. Por favor intente de nuevo.'));
    }
    return $this->redirect(['action' => 'index']);
这是我的职责:

function getHoraDiaMesAnio($countyid){

    switch ($countyid){
        case 1://Argentina
            date_default_timezone_set('America/Argentina/Buenos_Aires');
            putenv('TZ=America/Argentina/Buenos_Aires');     
            break;
        case 2://Bolivia
            date_default_timezone_set('America/La_Paz');
            putenv('TZ=America/La_Paz');     
            break;
    $dia= date("j");
    $mes= date("m");
    $anio= date("Y");
    $horaRedondeada = date("H:00");
    $horaExacta = date("H:i");    
    $horaCompleta = date("H:i:s");

return array($dia,$mes,$anio,$horaRedondeada,$horaExacta,$horaCompleta);`
问题是,时间戳从未正确设置。在其他服务中(不使用cakephp)可以完美地工作。我认为在cakephp中,我必须以另一种方式改变

你能帮我吗


谢谢

对我来说,这看起来太复杂了。我建议使用Cake/PHP提供的日期/时间API,时区调整应该是一个Cake,如果列是日期-时间类型,您可以简单地将
\DateTimeInterface
对象传递到保存过程中

$now = \Cake\Chronos\Chronos::now(); // uses the default app timezone, see the
                                     // date_default_timezone_set() call in bootstrap.php

switch ($countryid) {
    case 1:
        $now = $now->setTimezone('America/Argentina/Buenos_Aires');   
        break;

    case 2:
        $now = $now->setTimezone('America/La_Paz');
        break;
}

$turno->fechaBaja = $now;
如果
fechaBaja
列不是日期时间类型(最好是这样),只需将对象格式化为字符串:

$turno->fechaBaja = $now->toDateTimeString(); // formats as Y-m-d H:i:s
另见


解决方案可行,但时间与阿根廷不同。我的意思是:$now=$now->setTimezone(‘美国/阿根廷/布宜诺斯艾利斯’);设置:2017-06-04 11:44:51当实时时间为15:44时:51@FaustinoGagneten对我来说效果很好,我现在得到了
2017-06-04 16:11:28
。。。可能您的服务器时间设置不正确,或者未调用
setTimezone()
?更改时区前后(
debug($now)
)设置的
$now
是什么?结果:2017-06-04 19:31:03调试:2017-06-04 19:31:03 2017-06-04 19:31:03调试:2017-06-04 16:31:03。因此,新的日期时间没有问题,但在我的数据库中,现在设置为2017-06-04 11:44:51编辑:结果:2017-06-04 19:31:03调试:2017-06-04 19:31:03 2017-06-04 19:31:03调试:2017-06-04 16:31:03。因此,新的日期时间没有问题,但在我的数据库中,现在设置为2017-06-04 12:31:03@FaustinoGagneten这就是MySQL中的
TIMESTAMP
类型所做的,它“将时间戳值从当前时区转换为UTC进行存储,并从UTC转换回当前时区进行检索。”如果需要避免这种行为,应该使用
DATETIME