PostgreSQL在Yii2上的用户时区问题

Prabowo Murti

我想寻求更好的方法。我将Yii2与PostgreSQL一起使用,并将所有表的所有时间戳字段设置为timestamp with timezone数据类型。

timestamp with time zone NOT NULL DEFAULT now()

我创建了一个设置,每次响应都会调用该设置,

Yii::$app->setTimezone(MallSettings::getSetting('timezone', Yii::$app->session['mall_id']));

它将返回类似Asia/MakassarAsia/Jakarta(取决于用户设置)的信息。

\yii\18n\Formatter使用ZeedFormatter下面命名的类扩展了并创建了一个新函数来显示用户首选时区中的datetime值。

class ZeedFormatter extends \yii\i18n\Formatter
{
    /**
     * Format timestamp with timezone value to user's preferred timezone.
     * (extends the asDatetime() functionality)
     * 
     * @param  [type] $value  [description]
     * @param  [type] $format [description]
     * @return [type]         [description]
     */
    public function asLocaldatetime($value, $format = null)
    {
        $originalDateTime = \DateTime::createFromFormat('Y-m-d H:i:s.uO', $value);
        $originalDateTime->setTimezone(new \DateTimeZone(date_default_timezone_get()));

        if ($format === null)
            $format = 'Y-m-d H:i:s.uO';

        $localDateTime = $originalDateTime->format($format);

        return $localDateTime;

    }
}

这个想法是,每当我需要“本地”日期时间格式时,都可以这样称呼它:

    Yii::$app->formatter->asLocaldatetime('2019-08-29 19:52:21.02886+07');
    // will return 2019-08-29 20:52:21.02886+08 for Asia/Makassar timezone

或者,如果用于GridView


       'position',
       'created_at:localdatetime',

       ['class' => 'backend\widgets\ActionColumn'],

我可以仅使用Yii2的功能来获得此功能吗?或者(另一个选项)正在created_at AT TIME ZONE 'Asia/Makassar'从Psql查询中调用希望我能有所启发。谢谢。

Prabowo Murti

我的(另一种)方法是继续使用该asDatetime()功能。

我只是意识到我需要timezone从配置文件中删除/注释如果在此处设置了值,那么无论我如何在其他地方设置时区,common/config/main.php如果我们使用的是asDatetime格式化程序,Yii总是会从配置文件()中获取值

    'components' => [
        'formatter' => [
            // 'class' => '\common\modules\ZeedFormatter',
            'locale' => 'id-ID',
            // 'timeZone' => 'Asia/Jakarta',
            'defaultTimeZone' => 'Asia/Jakarta',
            'dateFormat' => 'php:j M Y',
            'decimalSeparator' => ',',
            'thousandSeparator' => '.',
            'currencyCode' => 'Rp ',
            'nullDisplay' => '<em style="color:#d8d8d8">null</em>',
            'numberFormatterOptions' => [
                NumberFormatter::MIN_FRACTION_DIGITS => 0,
                NumberFormatter::MAX_FRACTION_DIGITS => 0,
            ],
        ],
    ]

如果我们需要其他(或定制的)格式,我们仍然可以使用ZeedFormatter上述格式并添加一些所需的功能。例如 :

    public function asMyformat($value)
    {
        $timestamp = strtotime($value);
        $fmt = new \IntlDateFormatter('id-ID', \IntlDateFormatter::NONE, \IntlDateFormatter::LONG);

        $fmt->setPattern('hh:mm z');// will return something like '09:47 WITA' 

        return $fmt->format($timestamp);
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章