Решил всё же попробовать поработать с форматом ISO.
То есть передаю дату на фронт в формате 2019-03-25T11:56:00.000+05:00
В классе описания таблицы в поле типа DatetimeField добавил
Но проблема осталась и вот в чём она:
Я сохраняю сущность таким образом:
На этапе присвоения значения срабатывает метод cast из Bitrix\Main\ORM\Fields\DatetimeField
Который и знать не знает про форматы и использует системный (у меня он d.m.Y H:i:s)
В итоге - Incorrect date/time
Даже если сделать так
Всё равно - Incorrect date/time
Итог, до save_data_modification даже не доходит дело, потому что ранее битрикс пытается создать объект Datetime, но не нет возможности ему передать формат
На данный момент решил так
1. Удалил save_data_modification
2. В контроллере теперь сохраняю сущность так
Но в целом это больше похоже на костыль
То есть передаю дату на фронт в формате 2019-03-25T11:56:00.000+05:00
В классе описания таблицы в поле типа DatetimeField добавил
| Код |
|---|
'save_data_modification' => function () {
return [
function ($value) {
return new DateTime( $value, 'Y-m-d\TH:i:s.u\Z' );
},
];
}, |
Но проблема осталась и вот в чём она:
Я сохраняю сущность таким образом:
| Код |
|---|
$dislocation = DislocationTable::createObject();
foreach ($row as $field => $value) {
$dislocation->set( $field, $value );
}
$dislocation->save(); |
На этапе присвоения значения срабатывает метод cast из Bitrix\Main\ORM\Fields\DatetimeField
| Код |
|---|
/**
* @param mixed $value
*
* @return \Bitrix\Main\Type\Date|DateTime
* @throws \Bitrix\Main\ObjectException
*/
public function cast($value)
{
if (!empty($value) && !($value instanceof DateTime))
{
return new DateTime($value);
}
return $value;
} |
Который и знать не знает про форматы и использует системный (у меня он d.m.Y H:i:s)
В итоге - Incorrect date/time
Даже если сделать так
| Код |
|---|
DislocationTable::add( $row ) |
Итог, до save_data_modification даже не доходит дело, потому что ранее битрикс пытается создать объект Datetime, но не нет возможности ему передать формат
На данный момент решил так
1. Удалил save_data_modification
2. В контроллере теперь сохраняю сущность так
| Код |
|---|
$dislocation = DislocationTable::createObject();
foreach ($row as $field => $value) {
if ( \in_array( $field, $this->getDatetimeFields(), true ) ) {
$value = new DateTime( $value, 'Y-m-d\TH:i:s.u\Z' );
}
$dislocation->set( $field, $value );
}
$dislocation->save();
....
/**
* Получение имён полей типа Datetime
*
* @return array
* @throws ArgumentException
* @throws SystemException
*/
protected function getDatetimeFields(): array
{
$datetimeFields = [];
$fields = DislocationTable::getEntity()->getFields();
foreach ($fields as $field) {
if ( $field instanceof DatetimeField ) {
$datetimeFields[] = $field->getName();
}
}
return $datetimeFields;
} |
Но в целом это больше похоже на костыль