Adjusting time zone in PHP with DateTime / DateTimeZone

前端 未结 3 1652
粉色の甜心
粉色の甜心 2020-12-03 16:35

There\'s a lot of info on doing time zone adjustments in PHP, but I haven\'t found an answer for specifically what I want to do due to all the noise.

Given a time in

相关标签:
3条回答
  • 2020-12-03 16:38

    Here are a couple of functions using the DateTime classes. The first one will return the difference in seconds between two timezones. The second returns a "translation" of the time from one timezone to another.

    function timezone_diff($tz_from, $tz_to, $time_str = 'now')
    {
        $dt = new DateTime($time_str, new DateTimeZone($tz_from));
        $offset_from = $dt->getOffset();
        $timestamp = $dt->getTimestamp();
        $offset_to = $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->getOffset();
        return $offset_to - $offset_from;
    }
    
    function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s')
    {
        $dt = new DateTime($time_str, new DateTimezone($tz_from));
        $timestamp = $dt->getTimestamp();
        return $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->format($format);
    }
    

    Demo:

    $los_angeles_time = '2009-09-18 05:00:00';
    $los_angeles_tz   = 'America/Los_Angeles';
    $hawaii_tz        = 'Pacific/Honolulu';
    
    $los_angeles_hawaii_diff = timezone_diff($los_angeles_tz, $hawaii_tz, $los_angeles_time);
    echo $los_angeles_hawaii_diff . '<br />';
    
    $hawaii_time = time_translate($los_angeles_tz, $hawaii_tz, $los_angeles_time);
    echo $hawaii_time . '<br />';
    
    0 讨论(0)
  • 2020-12-03 16:42

    Simply minus the first time from the second.

    That you'll be able to get the time difference in terms of seconds.

    0 讨论(0)
  • 2020-12-03 16:54

    As GZipp commented, his code is really only for PHP >= 5.3.0. That is fine, but - here's a version that will work in PHP >= 5.2.0. (Incidentally, it also works in 5.3+, and with 2 less function calls)

    <?php
    function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s')
    {
        $dt = new DateTime($time_str, new DateTimezone($tz_from));
        $dt->setTimezone(new DateTimezone($tz_to));
        return $dt->format($format);
    }
    
    $time_diffs = array('now', '-1 hour', '-1 day', '-1 week', '-1 month', '+1 hour', '+1 week', '+1 month');
    
    foreach ($time_diffs as $diff)
    {
     echo "{$diff}:"
      . "\n\t"
      . "Current: " . date("Y-m-d H:i:s", strtotime($diff))
      . "\n\t"
      . "UTC: " . time_translate("US/Eastern", "UTC", $diff)
      . "\n\n";
    }
    
    0 讨论(0)
提交回复
热议问题