Так и не разобрался, почему данные в rules() подгружаются из базы, а не load(), может быть даже разработчикам напишу) ведь код в вопросе значительно красивей того, который работает.
В итоге добавлено поведение:
public function behaviors()
{
return [
[
'class' => AttributeBehavior::className(),
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => 'time',
ActiveRecord::EVENT_BEFORE_UPDATE => 'time',
],
'value' => function ($event) {
// время устанавливается исходя из выбранного пользователем часового пояса
$model = $event->sender;
$datetime = new DateTime($model->usertime, new DateTimeZone($model->timezone));
return $datetime->getTimestamp();
},
],
];
}
И 'time' убрал из rules():
public function rules()
{
return [
[['usertime'], 'date', 'type' => 'datetime'],
[['usertime', 'timezone'], 'required'],
[['name', 'timezone', 'period'], 'trim'],
[['name', 'timezone', 'period'], 'string', 'max' => 255],
...
];
}