Как в Yii2 сохранять в activeRecord отформатированные через formatter дату и время?

Mysql поле timestamp_start тип TIMESTAMP по умолчанию CURRENT_TIMESTAMP
Yii2 конфигурация formatter
'formatter' => [
            'locale' => 'ru-RU',
            'defaultTimeZone' => 'Europe/Moscow',
            'timeZone' => 'Asia/Yekaterinburg',
            'dateFormat' => 'dd.MM.yyyy',
            'timeFormat' => 'HH:mm:ss',
            'datetimeFormat' => 'dd.MM.yyyy HH:mm:ss',
]


Валидация в модели по формату хранения
public function rules()
{
     return [
            [['timestamp_start'], 'date', 'format' => 'php:Y-m-d H:i:s'],
     ];
}


форма
<?=
$form->field($model, 'timestamp_start')->widget(kartik\datetime\DateTimePicker::classname(), [
        'options' => [
                'value' => (!$model->timestamp_start) ? Yii::$app->formatter->asDatetime(date('Y-m-d H:i:s')) : Yii::$app->formatter->asDatetime($model->timestamp_start),
         ],
        'pluginOptions' => [
                'startDate' => Yii::$app->formatter->asDatetime(date('Y-m-d H:i:s')),
                'format' => Yii::$app->params['jsFormatter']['datetimeFormat'],
                 'autoclose' => true,
         ]
]);
?>


Как правильно сохранить отформатированную дату из формы в родной временной зоне ('Europe/Moscow').

Копал в сторону behaviours есть события:
ActiveRecord::EVENT_BEFORE_INSERT
ActiveRecord::EVENT_BEFORE_UPDATE
ActiveRecord::EVENT_BEFORE_VALIDATE

Писал обработчик переформатирования и смены временной зоны через DateTime
Форматирование успешно а вот временная зона обратно не меняется.
Пробовал через beforeValidate() - результат тот же
В итоге каждое сохранение + 2 часа.

MYSQL 5.7
PHP 7.1
  • Вопрос задан
  • 1573 просмотра
Решения вопроса 1
@BorisKorobkov Куратор тега MySQL
Web developer
Проще всего хранить и в БД, и в переменной в формате "Y-m-d H:i:s".
А отображать и вводить в виджете в любом нужном формате. При вводе виджет автоматически изменит формат.
В конфиге добавьте типа
'modules' => [
                        'datecontrol' => [
                                'class' => 'kartik\datecontrol\Module',
                                // format settings for displaying each date attribute (ICU format example)
                                'displaySettings' => [
                                        'date' => 'dd.MM.yyyy',
                                        'time' => 'HH:mm',
                                        'datetime' => 'dd.MM.yyyy HH:mm',
                                ],
                                // format settings for saving each date attribute (PHP format example)
                                'saveSettings' => [
                                        'date' => 'php:Y-m-d', // saves as unix timestamp
                                        'time' => 'php:H:i:s',
                                        'datetime' => 'php:Y-m-d H:i:s',
                                ],
                        ],
                ],
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы