sanek_os9
@sanek_os9
Работаю с Laravel, Vue, Vuetify, AWS Amazon, Linux

Как не терять временя при изменении формата в DateTime?

Доброе утро, проблема у меня вот какая, есть поле
<input type="datetime-local" name="deadlines" value="2017-06-01T08:30">

Дату и время сохраняю в unix
$date = new \DateTime($deadlines);
$deadlines = $date->format('U')); // это сохраняю в бд

Потом вывожу в прежней дате
$date = new \DateTime('@' . $task['deadlines']); 
$task['deadlines'] = $date->format('Y-m-d\T\0G:30');

и в $task['deadlines']получаю на три часа меньше чем сохранял
-----------------
Только что проделал следующее, введенную дату конвертировал в unix, потом то что получилось конвертировал назад в прежний формат (не добавляя в бд), и получил уже другой результат
$date = new \DateTime($deadlines);
echo 'Пришло: ' . $deadlines . '<br />';
if ($deadlines = $date->format('U')) {
     echo 'Конвертировали в : ' . $deadlines . '<br />';
    Task::create($message, $deadlines, $importance, $id_project);
}

В ф-ции
echo 'приняли:' . $deadlines . '<br/>';
$date = new \DateTime('@' . $deadlines);
echo 'Изменим в формат в котором будем выводить в будущем: ' . $date->format('Y-m-d\TH:i');

Результат
Пришло: 2017-06-01T09:37
Конвертировали в : 1496299020
Ф-ция для сохранения в БД приняла:1496299020
Изменим в формат в котором будем выводить в будущем: 2017-06-01T06:37

Как видим, пришло 09:37 и получилось 06:37
  • Вопрос задан
  • 319 просмотров
Решения вопроса 2
sanek_os9
@sanek_os9 Автор вопроса
Работаю с Laravel, Vue, Vuetify, AWS Amazon, Linux
Решение: вместо
$date = new \DateTime('@' . $deadlines);
прописать
$date = new \DateTime();
$date->setTimestamp($deadlines);

Оба варианта взяты с php.net/manual/ru/datetime.settimestamp.php
Только они работают по разному, что доставило мне немало удовольствия в поисках решения проблемы.
Ответ написан
@Fortop
Tech/Team lead
https://en.wikipedia.org/wiki/Unix_time
Для понимания того, почему при установке из timestamp используется другой часовой пояс.

Ваши "потерянные" три часа это разница между default timezone в ваших настройках и UTC который используется в timestamp
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
nazarpc
@nazarpc
Open Source enthusiast
Сколько времени на это подобные вопросы убито, а решение простое: хранить даты в БД в bigint (64-bit) поле в формате Unix timestamp. А в приложении приводите к нужному часовому поясу. И никаких проблем, не зависимо от конфигурации сервера БД.
Ответ написан
@kisaa
минуты всегда округляет до 30, не важно сколько я буду сохранять, то ли 08:30, то ли 08:15 или 08:00 всегда сохранит 08:30

а вот эта строчка что должна делать?
$date->format('Y-m-d\T\0G:30');
Ответ написан
Ваш ответ на вопрос

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

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