Дата в формате RFC3339

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Сергей2003
Сообщения: 92
Зарегистрирован: 2018.08.11, 11:07

Дата в формате RFC3339

Сообщение Сергей2003 »

Я записываю из json-данных "created_at": "2018-07-10T14:25:27.535Z"
дату в $date

Код: Выделить всё

 $date = $payment['created_at'];
Мне надо $date записать в базу данных. Тип даты в базе - timestamp. Хотел сделать так:

Код: Выделить всё

$date = new \DateTime($date)
Выдается сообщение об ошибке - $date должен быть строкой.
Если тупо записываю

Код: Выделить всё

$date = '2018-08-18T11:45:25.535Z';
и сохраняю в таком виде в базу, все проходит успешно. Как мне привести значение типа date в строку, форматировать не надо.
Ребята, подскажите, пожалуйста. Что-то я "затормозил".
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Дата в формате RFC3339

Сообщение futbolim »

Сначала научитесь гуглить, потом можно посмотреть документацию Datetime.
https://stackoverflow.com/a/9897104
Сергей2003
Сообщения: 92
Зарегистрирован: 2018.08.11, 11:07

Re: Дата в формате RFC3339

Сообщение Сергей2003 »

Мне не нужен DateTime() и не нужно форматирование даты. У меня уже есть дата:

Код: Выделить всё

$date = $payment['created_at'];
Но у нее тип "date". И мне надо привести ее к типу "string". Надо к примеру получить:

Код: Выделить всё

$date = '2018-08-18T11:45:25.535Z';
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Дата в формате RFC3339

Сообщение urichalex »

Сергей2003 писал(а): 2018.08.18, 15:02 Мне не нужен DateTime() и не нужно форматирование даты. У меня уже есть дата:

Код: Выделить всё

$date = $payment['created_at'];
Но у нее тип "date". И мне надо привести ее к типу "string". Надо к примеру получить:

Код: Выделить всё

$date = '2018-08-18T11:45:25.535Z';

Код: Выделить всё

$date = new \DateTime();
$date->setTimestamp(1234);
$formatted = $date->format(DATE_RFC3339);
Сергей2003
Сообщения: 92
Зарегистрирован: 2018.08.11, 11:07

Re: Дата в формате RFC3339

Сообщение Сергей2003 »

Зачем мне делать setTimestamp. Во-первых, параметр д.б. целым числом. Вот

Код: Выделить всё

$formatted = $date->format(DATE_RFC3339);
более-менее близко к результату, но теряются 3 часа. Наверно надо использовать другой формат.
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Дата в формате RFC3339

Сообщение urichalex »

Сергей2003 писал(а): 2018.08.18, 15:45 Зачем мне делать setTimestamp. Во-первых, параметр д.б. целым числом
Эм.. А timestamp это не целое число?
Сергей2003 писал(а): 2018.08.18, 15:45 Вот

Код: Выделить всё

$formatted = $date->format(DATE_RFC3339);
более-менее близко к результату, но теряются 3 часа. Наверно надо использовать другой формат.
Настраивайте timeZone
Сергей2003
Сообщения: 92
Зарегистрирован: 2018.08.11, 11:07

Re: Дата в формате RFC3339

Сообщение Сергей2003 »

Я неправильно выразился. Мне не нужен setTimestamp, т.к. он использует в качестве параметра целое число. Мне это не подходит.
DATE_RFC3339 тоже не подходит, т.к. в последний символ у меня "Z".
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Дата в формате RFC3339

Сообщение andku83 »

Код: Выделить всё

$date = (string)$payment['created_at'];
Сергей2003
Сообщения: 92
Зарегистрирован: 2018.08.11, 11:07

Re: Дата в формате RFC3339

Сообщение Сергей2003 »

$date = (string)$payment['created_at'];
В этом случае выдает ошибку: Объект класса DateTime не может быть преобразован в строку.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Дата в формате RFC3339

Сообщение andku83 »

сделайте var_dump($payment['created_at']) - и посмотрите кто у вас там, а потом разбирайтесь как у того объекта получить нужные вам данные
Сергей2003
Сообщения: 92
Зарегистрирован: 2018.08.11, 11:07

Re: Дата в формате RFC3339

Сообщение Сергей2003 »

Спасибо всем за помощь. Разобрался. Теперь меня интересует как настроитть timezone. Пользователи могут находиться в различных временных зонах. В базе дата/время будут находиться в формате UTC.
При выборке из базы дату/время надо преобразовать к текущей временной зоне.
И вот вопрос:
1. как узнать текущую временную зону пользователя
С помощью date_default_timezone_get() ?
2. а затем значение этой зоны и установить при
форматировании даты/времени
(Format(DATE_RFC3339)) ?
Так или нет ? Ребята, надеюсь на Вашу помощь.
Toshus
Сообщения: 14
Зарегистрирован: 2018.06.06, 21:06

Re: Дата в формате RFC3339

Сообщение Toshus »

Я использовал приведение времени к временной зоне уже на клиенте. С сервера время отсылается в unix-формате, приведенное к UTC+0 и корректируется на клиенте на величину (new Date()).getTimezoneOffset() * 60. Ну а дальше уже форматировать можно в любое представление.

Если обязательно нужно вычислять время на сервере, то это смещение можно сохранить в куках, например, попросить указать часовой пояс при регистрации и сохранить в БД, либо при первом обращении пользователя скриптом передать ajax запросом и сохранить в БД
Ответить