PHP Timestamp Изменения до полуночи на следующий день - PullRequest
0 голосов
/ 02 января 2019

Я пробовал разные способы изменить метку времени с полуночи на следующий день, но мне не повезло.Я использую Wordpress и изменил местоположение по умолчанию на Mountain Time.Я подумал, что эти двое будут общаться вместе, но мне не повезло.

<?php current_time(timestamp);   echo date('l, F jS Y'); ?>

<?php ini_set('date.timezone', 'America/Denver');
echo date('l, F jS Y'); ?>

Первый, который я сейчас пробую, и второй фрагмент, который я использовал ранее.

Трудно это отладить, так как мне приходится ждать до ночи, чтобы увидеть, не изменится ли дата с раннего на следующий день.Не оптимальноЯ ценю любую помощь в этом.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Функция, которая возвращает точную разницу часовых поясов вместе со временем обновления в том числе DayLight Saving. Не стесняйтесь связаться для дальнейшего помощь.

/*
 * @function minusonesecond return timezone
 * @param integer $timezonedifference       optional
 * @return string time
 * @Comment Get User TimeZone Difference
 */
public function minusonesecond($timezonedifference=""){
    $i=0;
    $time = explode(":", $timezonedifference);
    if($time[0]<0){$sign=-1; }else {$sign =1;}
    foreach ($time as $endtmp){
        $endtmp = $sign*$endtmp;
        if($i>0){
            $tmp[$i] = (($endtmp*1==0) ?  59: ($endtmp-1));
        } else $tmp[$i] = ($endtmp-1);
        $i++;
    }
    $ret = ($sign)* $tmp[0].":".(($tmp[1]>9)?$tmp[1]:"0$tmp[1]").":".(($tmp[2]>9)?$tmp[2]:"0$tmp[2]");
    return $ret ;
}

/**
 * @function getusertimezonedifference return timezone difference with UTC
 * @param integer $timezonedifference       optional
 * @return string time
 * @Comment Get User TimeZone Difference
 */
public function getusertimezonedifference($user_id = "", $changetoUTC=false, $flg_array=false)
{
    $user = $this->User->find("first", array("conditions" => array("User.user_id" => $user_id)));
    $timezone = $user["Timezone"]["timezone_name"];
    $dayLightFlag = false;
    $system_timezone = date_default_timezone_get();
    $local_timezone = "UTC";
    date_default_timezone_set($local_timezone);
    $local = date("Y-m-d H:i:s");
    date_default_timezone_set("GMT");
    $gmt = date("Y-m-d H:i:s");
    date_default_timezone_set($timezone);
    $required = date("Y-m-d H:i:s");
    date_default_timezone_set($system_timezone);
    $diff1 = (strtotime($gmt) - strtotime($local));
    $diff2 = (strtotime($required) - strtotime($gmt));
    if($changetoUTC) {$diff2 =  (-1*$diff2);}
    // extract hours
    $hours = floor($diff2 / (60 * 60));
    // extract minutes
    $divisor_for_minutes = $diff2 % (60 * 60);
    $minutes = floor($divisor_for_minutes / 60);
    // extract the remaining seconds
    $divisor_for_seconds = $divisor_for_minutes % 60;
    $seconds = ceil($divisor_for_seconds);

    //create string HH:MM:SS
    $ret = $hours.":".(($minutes>9)?$minutes:"0$minutes").":".(($seconds>9)?$seconds:"0$seconds");
    if($flg_array){$ret = array($hours, (($minutes>9)?$minutes:"0$minutes"), ($seconds>9)?$seconds:"0$seconds");}
    return ($ret);
}

/**
 * @function getPSTtimezonedifference return timezone difference with UTC AND PST
 * @param  $changetoUTC       optional
 * @param $flg_array       optional
 * @return string time
 * @Comment Get User TimeZone Difference
 */
public function getPSTtimezonedifference($changetoUTC=false, $flg_array=false)
{
    $timezone = "America/Los_Angeles";
    $dayLightFlag = false;
    $system_timezone = date_default_timezone_get();
    $local_timezone  = "UTC";
    date_default_timezone_set($local_timezone);
    $local = date("Y-m-d H:i:s");
    date_default_timezone_set("GMT");
    $gmt = date("Y-m-d H:i:s");
    date_default_timezone_set($timezone);
    $required = date("Y-m-d H:i:s");
    date_default_timezone_set($system_timezone);
    $diff1 = (strtotime($gmt) - strtotime($local));
    $diff2 = (strtotime($required) - strtotime($gmt));
    if($changetoUTC) {$diff2 =  (-1*$diff2);}
    // extract hours
    $hours = floor($diff2 / (60 * 60));
    // extract minutes
    $divisor_for_minutes = $diff2 % (60 * 60);
    $minutes = floor($divisor_for_minutes / 60);
    // extract the remaining seconds
    $divisor_for_seconds = $divisor_for_minutes % 60;
    $seconds = ceil($divisor_for_seconds);

    //create string HH:MM:SS
    $ret = $hours.":".(($minutes>9)?$minutes:"0$minutes").":".(($seconds>9)?$seconds:"0$seconds");
    if($flg_array){$ret = array($hours, (($minutes>9)?$minutes:"0$minutes"), ($seconds>9)?$seconds:"0$seconds");}
    return ($ret);
}
0 голосов
/ 02 января 2019

Похоже, у вас недостаточно настроен часовой пояс на вашем сервере.Просто выведите полную дату и время, вам не нужно ждать полуночи, чтобы узнать разницу между правильным и неправильным часом.

Что касается времени и часового пояса в php, вам нужно знать два факта:

  • отметки времени всегда указаны по Гринвичу, НЕ в зависимости от часового пояса
  • Дата выводится в формате отметки времени, в зависимости от часового пояса

Зная это, вы легко можете отладить свою программу.

<?php 

echo date('r').PHP_EOL; 
// timezone not configured
// Wed, 02 Jan 2019 16:11:36 +0000
echo date('U').PHP_EOL; 
// 1546445496
ini_set('date.timezone', 'America/Denver');
echo date('r').PHP_EOL;
// Wed, 02 Jan 2019 09:11:36 -0700
echo date('U').PHP_EOL; 
// 1546445496 , same as above

С этого момента у вас есть много решений, я рекомендую следующие два:

  • Поставьте этов вашем файле php.ini:

     date.timezone="America/Denver"
    
  • Если вы не можете редактировать php.ini, используйте объект DateTime для его преобразования вручную.

     $d = new DateTime();
     $d->setTimezone(new DateTimeZone('America/Denver'));
     echo $d->format('r').PHP_EOL;
     // Wed, 02 Jan 2019 09:11:36 -0700
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...