使用 asTime() 的时间不正确
time using asTime() not correct
在我的网格视图中,我可以更改时间和日期列以使用我的时区
[
'format' => [
'class' => 'yii\i18n\Formatter',
'timeZone' => 'Asia/Singapore',
],
'attribute' => 'created_at',
'label' => 'Date',
'filter' => false,
'value'=> function($model, $key, $index, $column){ return Search::getDateTime($model); }, }
'format' => 'raw',
]
然后在我的搜索模型中我有这个
public static function getDateTime($model) {
$date = Yii::$app->formatter->asDate($model->created_at);
$time = Yii::$app->formatter->asTime($model->created_at);
return Html::a($date, null, ['href' => 'javascript:void(0);', 'class' => 'btn btn-link p-0 rounded-0 tooltips', 'data-toggle' => 'tooltip', 'data-placement'=> 'bottom', 'title' => $time]);
}
我的 main.php 组件中也有这个
'formatter' => [
'class' => 'yii\i18n\Formatter',
'dateFormat' => 'php:j M Y',
'datetimeFormat' => 'php:d/m/Y h:i a',
'timeFormat' => 'php:H:i A',
'defaultTimeZone' => 'Asia/Singapore'
],
在我的数据库中 created_at
是这样保存的 2021-11-22 11:28:16
UTC
如何让它根据我的时区显示正确的时间? (Asia/Singapore)
您保存的日期时间是日期和时间,但没有参考 UTC 时区。因此,不可能将它们自动格式化为 Asia/Singapore 日期时间。取而代之的是,因为您知道它们是 UTC,而 Asia/Singapore 是 UTC+8,您可以将 8 小时添加到您的日期时间。
所以,我将代码添加到:
- 根据 created_at 字段值创建 DateTime 对象。
- 增加 8 小时。
- 获取新的 created_at 值,增加了 8 小时。
- 然后继续你的原始代码。
你在这里:
public static function getDateTime($model)
{
$datetime = new DateTime($model->created_at, new DateTimeZone('UTC'));
$datetime->add(new DateInterval('PT8H'));
$created_at = $datetime->format('Y-m-d H:i:s');
$date = Yii::$app->formatter->asDate($created_at);
$time = Yii::$app->formatter->asTime($created_at);
return Html::a($date, null, ['href' => 'javascript:void(0);', 'class' => 'btn btn-link p-0 rounded-0 tooltips', 'data-toggle' => 'tooltip', 'data-placement'=> 'bottom', 'title' => $time]);
}
这是将日期时间从 UTC 转换为特定时区的另一种(可能更好)方法:
UTC Date/Time String to Timezone
在我的网格视图中,我可以更改时间和日期列以使用我的时区
[
'format' => [
'class' => 'yii\i18n\Formatter',
'timeZone' => 'Asia/Singapore',
],
'attribute' => 'created_at',
'label' => 'Date',
'filter' => false,
'value'=> function($model, $key, $index, $column){ return Search::getDateTime($model); }, }
'format' => 'raw',
]
然后在我的搜索模型中我有这个
public static function getDateTime($model) {
$date = Yii::$app->formatter->asDate($model->created_at);
$time = Yii::$app->formatter->asTime($model->created_at);
return Html::a($date, null, ['href' => 'javascript:void(0);', 'class' => 'btn btn-link p-0 rounded-0 tooltips', 'data-toggle' => 'tooltip', 'data-placement'=> 'bottom', 'title' => $time]);
}
我的 main.php 组件中也有这个
'formatter' => [
'class' => 'yii\i18n\Formatter',
'dateFormat' => 'php:j M Y',
'datetimeFormat' => 'php:d/m/Y h:i a',
'timeFormat' => 'php:H:i A',
'defaultTimeZone' => 'Asia/Singapore'
],
在我的数据库中 created_at
是这样保存的 2021-11-22 11:28:16
UTC
如何让它根据我的时区显示正确的时间? (Asia/Singapore)
您保存的日期时间是日期和时间,但没有参考 UTC 时区。因此,不可能将它们自动格式化为 Asia/Singapore 日期时间。取而代之的是,因为您知道它们是 UTC,而 Asia/Singapore 是 UTC+8,您可以将 8 小时添加到您的日期时间。
所以,我将代码添加到:
- 根据 created_at 字段值创建 DateTime 对象。
- 增加 8 小时。
- 获取新的 created_at 值,增加了 8 小时。
- 然后继续你的原始代码。
你在这里:
public static function getDateTime($model)
{
$datetime = new DateTime($model->created_at, new DateTimeZone('UTC'));
$datetime->add(new DateInterval('PT8H'));
$created_at = $datetime->format('Y-m-d H:i:s');
$date = Yii::$app->formatter->asDate($created_at);
$time = Yii::$app->formatter->asTime($created_at);
return Html::a($date, null, ['href' => 'javascript:void(0);', 'class' => 'btn btn-link p-0 rounded-0 tooltips', 'data-toggle' => 'tooltip', 'data-placement'=> 'bottom', 'title' => $time]);
}
这是将日期时间从 UTC 转换为特定时区的另一种(可能更好)方法: UTC Date/Time String to Timezone