|
|
|
| Подскажите пожалуйста, уже неделю не могу решить проблему с временными зонами в php
Установлено в php date_default_timezone_set('Europe/Moscow');
если сделать так
<?php
$date = new DateTime();
echo date('Y-m-d H:i:s', $date->getTimestamp());
|
работает все нормально выводится текущее время
но если записать данные в mysql поле timestamp
при выводе
<?php
var_dump(
date('Y-m-d H:i:s', strtotime($post->created_at->format('Y-m-d H:i:s'))),
date('Y-m-d H:i:s', $post->created_at->getTimestamp())
);
|
выводится разное время, первое правильное, а второе на час больше
пробовал разные настройки ничего не помогает, но если установить например
date_default_timezone_set('Europe/London'); или UTC, то выводит одинаковое время
мне кажется это как-то связано с летним зимним временем, но ничего не могу найти | |
|
|
|
|
|
|
|
для: Visavi
(03.08.2014 в 19:01)
| | Если у вас выделенный сервер, то unixtime берётся из ОС. Смотрите какое время на сервере установлено (по ssh). | |
|
|
|
|
|
|
|
для: Rolex
(04.08.2014 в 01:45)
| | Нет, тестирую на локальном сервере, смотрел на windows, mac и ubuntu везде gittimestamp() возвращает на час больше
<?php
// Без записи в базу возвращается такой результат объекта
// Тут все правильно
object(DateTime)[100]
public 'date' => string '2014-08-04 11:29:05' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'Europe/Moscow' (length=13)
//из базы возвращает такой
'created_at' =>
object(ActiveRecord\DateTime)[97]
private 'model' =>
&object(Guest)[95]
private 'attribute_name' => string 'created_at' (length=10)
public 'date' => string '2014-07-16 13:54:26' (length=19)
public 'timezone_type' => int 2
public 'timezone' => string 'MSK' (length=3)
|
| |
|
|
|
|
|
|
|
для: Visavi
(04.08.2014 в 11:33)
| | SQL вообще использует системное время, а не "если..." | |
|
|
|
|
|
|
|
для: confirm
(04.08.2014 в 12:02)
| | Возможно я неправильно описал проблему
При выводе из БД MySQL, но разными способами, выводится разное время
<?php
echo strtotime($post->created_at->format('Y-m-d H:i:s'));
echo $post->created_at->getTimestamp();
|
во втором случае на 3600 секунд больше | |
|
|
|
|
|
|
|
для: Visavi
(04.08.2014 в 13:34)
| | Еще раз:
РНР использует корректируемое системное время на плюс/минус установленное вами смещение. SQL же работает по системному времени. И, например, запрос типа 'SELECT NOW()' и функция date('Y-m-d H:i:s') могут вернуть разные результаты, и не обязательно с разницей на час, все будет зависеть от установленной зоны. Чтобы и SQL возвращал такой же результат, нужно установить смещение и для SQL - SET time_zone.
Если вы вносили в базу время не функциями SQL, и в результате получаете разницу в 1 час, то вполне возможно что в чем-то не учтено летнее время, хотя, если речь о нашем времени, то у нас его на данный момент нет. | |
|
|
|
|
|
|
|
для: confirm
(04.08.2014 в 14:24)
| | Пробовал и set time_zone = '+03:00'; и SET GLOBAL time_zone = '+03:00'; и SET @@session.time_zone = "+03:00"; не помогает
время меняется но все равно отличается на 1 час
php activerecord записывает в базу время через date https://github.com/jpfuentes2/php-activerecord/blob/master/lib/Model.php#L1141
если установить временную зону любую отличную от Europe/Рос. города то оба способа выводят кол. секунд с 1970 года правильно | |
|
|
|
|
|
|
|
для: Visavi
(04.08.2014 в 15:09)
| | Ну я же сказал, если пишите дату не средствами SQL, то он не причем, и значит смотрите какое время формирует этот класс. | |
|
|
|
|
|
|
|
для: Visavi
(04.08.2014 в 15:09)
| | иными словами, Вы считаете, что в Москве время отличается от UTC на три часа?
Вообще-то это не так. | |
|
|
|