zoukankan      html  css  js  c++  java
  • php时间转换,从a时区转换到b时区

    <?php
    /**
     * Created by PhpStorm.
     * User: lxd
     * Date: 2019/1/9
     * Time: 13:25
     * Comm:
     */
    
    class DtFormat
    {
        protected $dt;
        protected $ttz; //目标时区
        protected static $instance;
    
        private function __construct( $ftz, $ttz )
        {
            if( !$ftz || !$ftz instanceof DateTimeZone )
                $ftz        = new DateTimeZone( date_default_timezone_get() ); //默认来源时区
    
            if( !$ttz || !$ttz instanceof  DateTimeZone )
                $this->ttz  = new DateTimeZone( C('PARTNER_TIME_ZONE') ); //默认输出时区
            else
                $this->ttz  = $ttz;
    
            $this->dt   = new DateTime( 'now', $ftz );
        }
    
        /**
         * author liuxiaodong
         * date 2019/1/11 15:19
         * @param null $ftz 来源时区
         * @param null $ttz 目标时区
         * @return DtFormat
         */
        public static function getInstance( $ftz = null, $ttz = null )
        {
            if( !$ftz && !$ttz )
                $key    = '0';
            else {
                $ftz_key    = $ftz instanceof DateTimeZone ? $ftz->getName() : null;
                $ttz_key    = $ttz instanceof DateTimeZone ? $ttz->getName() : null;
                $key        = md5( $ftz_key . $ttz_key );
            }
            if( !self::$instance[$key] instanceof self ) {
                self::$instance[$key]     = new self( $ftz, $ttz );
            }
    
            return self::$instance[$key];
        }
    
        public function show( $original, $formart = 'Y-m-d H:i:s' )
        {
            //将时间转成时间戳
            $new_original       = @($original + 0);
            if (strlen($new_original) != strlen($original)) {
                $new_original   = strtotime($original);
                if (!$new_original)
                    return $original;
            }
    
            /**
             * notice
             * 时区不一致,同一个时间转换成时间戳是不一样的 !!
             *  $str    = '2018-09-26 07:23:31';
                var_dump( date_default_timezone_get() ); //UTC
                var_dump( strtotime( $str ) ); //1537946611
    
                date_default_timezone_set( 'PRC' );
                var_dump( strtotime( $str ) ); //1537917811
             *
             */
            $datetime       = null;
            if( $this->dt->getTimezone()->getName() == date_default_timezone_get() ) {
                $datetime   = clone $this->dt;
                $datetime   = $datetime->setTimestamp($new_original);
            }else {
                $tmpDt      = new DateTime();
                $tmpDt->setTimestamp( $new_original );
    $datetime = DateTime::createFromFormat( 'Y-m-d H:i:s', $tmpDt->format( 'Y-m-d H:i:s' ), $datetime->getTimezone() );
     } $datetime->setTimezone($this->ttz); return $datetime->format( $formart ); } }

     调用: 

    try{
                $timestr         = '2018-10-10 12:00:00';
                $ftimezone       = new DateTimeZone( 'UTC' );
                $ttimezone       = new DateTimeZone( 'PRC' );
                $newtm           = DtFormat::getInstance( $ftimezone, $ttimezone )->show( $timestr );
                echo(  "old = {$timestr}; new = {$newtm}" );
            }catch ( Exception $e ) {
                //error
            }

    结果:  old = 2018-10-10 12:00:00; new = 2018-10-10 20:00:00

  • 相关阅读:
    springboot 集成redission 以及分布式锁的使用
    springboot 使用线程池
    springboot 引入logback框架
    StringRedisTemplate 使用示例,工具类
    XHR post请求下载文件
    java List对象排序
    springboot中使用resttemplate调用服务是设置header中的accept-charset
    面试
    本地包打到项目中利用maven
    sql
  • 原文地址:https://www.cnblogs.com/lxdd/p/10256269.html
Copyright © 2011-2022 走看看