时间使用asTime()不正确

0

的问题

在我的网格图我有这样的改变列时间和日期使用我的时间

[
    '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

我怎么得到它显示正确的时间根据我的时间? (亚/新加坡)

amazon-rds php yii2
2021-11-22 19:53:38
1

最好的答案

0

你保存datetimes日期和时间,但没有提到UTC区。 所以,这是不可能自动套用格式,他们向亚/新加坡datetime。 而不是说,你知道,他们是UTC,亚/新加坡是UTC8,可以添加8个小时你datetimes.

因此,我加入代码:

  • 创建一个DateTime对象从创建领域的价值。
  • 添加8个小时。
  • 获得新创建的价值,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的日期/时间串时区

2021-11-24 13:16:29

有没有办法制定这种全球? 或者我需要它的每一次我使用 asDate()asTime() ? 因为我所有的datetimes保存在DB作为日期和时间。
Shaho

我的使用设置时区对于我的整个网络应用程序,使用自己的亲(). 这种方式,我的系统在次区我想,并datetimes保存在DB根据这一时区,因此我可以使用他们,因为他们被储存。
José Carlos PHP

使用 Europe/London 是坏主意。 英国使用的是夏令时间的系统,因此,时间会使用UTC日期在冬季,但UTC+1日期在夏季。 你应该使用 new DateTimeZone('UTC') 而不是如果你的时间总是存为UTC。
Michal Hynčica

@MichalHynčica你是对的,我已经编辑我的回答谢谢你!
José Carlos PHP

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................