我想寻求更好的方法。我将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/Makassar
或Asia/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查询中调用?希望我能有所启发。谢谢。
我的(另一种)方法是继续使用该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] 删除。
我来说两句