在php中带有偏移量的时区Datetime,使用起来很简单

在php中带有偏移量的时区Datetime,使用起来很简单,php,date,timezone,Php,Date,Timezone,我有来自特定时区(牙买加)的时间戳,我想得到它的GMT时间戳。有没有比这更优雅的解决方案: $start = DateTime::createFromFormat('U', 1330560000); $start->setTimezone(new DateTimeZone('America/Jamaica')); $start->format('Y-m-d H:i:s');//2012-02-29 19:00:00 NO NO NO

我有来自特定时区(牙买加)的时间戳,我想得到它的GMT时间戳。有没有比这更优雅的解决方案:

$start = DateTime::createFromFormat('U', 1330560000);
        $start->setTimezone(new DateTimeZone('America/Jamaica'));
        $start->format('Y-m-d H:i:s');//2012-02-29 19:00:00 NO NO NO

        $tz = new DateTimeZone( 'America/Jamaica' );
        $transition = $tz->getTransitions($start->getTimestamp(),$start->getTimestamp());


        $offset = $transition[0]['offset'];


        $start = DateTime::createFromFormat('U', $params['start'] - 2*$transition[0]['offset']);
        $start->setTimezone(new DateTimeZone('America/Jamaica'));
        $start->format('Y-m-d H:i:s'); // "2012-03-01 05:00:00" YESSSS!!!

这是我的类的一部分,它创建了一个格式良好的时间戳,正如我在函数的注释中所写的,它非常容易使用,只需传递日期、时区和标识符的字符串

希望对你有帮助

/**
* Default timestamp format for formatted_time
* @var  string
*/
public static $timestamp_format = 'Y-m-d H:i:s';
/**
* Returns a date/time string with the specified timestamp format
* @example $time = Date::formatted_time('5 minutes ago');
* @link    http://www.php.net/manual/datetime.construct
* @param   string  $datetime_str       datetime string
* @param   string  $timestamp_format   timestamp format
* @param   string  $timezone           timezone identifier
* @return  string
*/
public static function formatted_time($datetime_str = 'now', $timestamp_format = NULL, $timezone = NULL){
            $timestamp_format = ($timestamp_format == NULL) ? Date::$timestamp_format : $timestamp_format;
            $timezone         = ($timezone === NULL) ? Date::$timezone : $timezone;
            $tz   = new DateTimeZone($timezone ? $timezone : date_default_timezone_get());
            $time = new DateTime($datetime_str, $tz);
            if ($time->getTimeZone()->getName() !== $tz->getName()){
                $time->setTimeZone($tz);
            }
            return $time->format($timestamp_format);
        }

Unix时间或POSIX时间是一种用时间描述实例的系统,定义为自协调世界时(UTC)1970年1月1日午夜以来经过的秒数

来源


UNIX时间戳的思想是它总是以UTC(世界上任何地方的xD)为单位。如果它不以UTC表示时间,则不再是UNIX时间戳

时间戳在时区之间是不变的。具体来说,
1330560000
是2012-03-01 00:00:00 UTC。如果这不是您想要的时间,则生成此时间戳的代码有问题。@Jon 1330560000是牙买加时间(或任何其他有|无DST的时区),我需要UTC时间(2012-03-01 05:00:00)@user1222955:No,1330560000不是“牙买加时间”。这是一个特定的时间点,UTC是00:00:00,牙买加是2012-02-29 19:00:00(很明显,UTC-5)。PHP在这里所做的是正确的;是你的期望错了。如果应该得到的结果是您期望的结果,那么生成时间戳的代码也是错误的。您能否帮助我编写一个函数,以某种方式假定它实际上是2012-03-01 00:00:00牙买加时间,并且需要转换为UTC,2012-03-01 05:00:00?感谢您的澄清。好的,1330560000是牙买加时间,不是UTC。我想要UTC@user1222955这是UTC,不是牙买加。只需设置GMT时区,然后格式化日期时间。在脚本中,您将更改第2行发布到
$start->setTimezone(新的日期时区('GMT')),并删除该。。。不管第四行后面是什么。DateTime::format()格式化为其设置的当前时区的时间。因此,如果您想让它打印GMT时间,请使用GMT DateTimeZone为其提供信息。想要再次成为牙买加人-将时区设置回牙买加。时间戳总是UTC,除非你们的时钟设置错误,否则它在整个世界都是相等的。