Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с date_default_timezone_set
 
 автор: Visavi   (03.08.2014 в 19:01)   письмо автору
 
 

Подскажите пожалуйста, уже неделю не могу решить проблему с временными зонами в 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, то выводит одинаковое время
мне кажется это как-то связано с летним зимним временем, но ничего не могу найти

  Ответить  
 
 автор: Rolex   (04.08.2014 в 01:45)   письмо автору
 
   для: Visavi   (03.08.2014 в 19:01)
 

Если у вас выделенный сервер, то unixtime берётся из ОС. Смотрите какое время на сервере установлено (по ssh).

  Ответить  
 
 автор: Visavi   (04.08.2014 в 11:33)   письмо автору
 
   для: 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)

  Ответить  
 
 автор: confirm   (04.08.2014 в 12:02)   письмо автору
 
   для: Visavi   (04.08.2014 в 11:33)
 

SQL вообще использует системное время, а не "если..."

  Ответить  
 
 автор: Visavi   (04.08.2014 в 13:34)   письмо автору
 
   для: 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 секунд больше

  Ответить  
 
 автор: confirm   (04.08.2014 в 14:24)   письмо автору
 
   для: Visavi   (04.08.2014 в 13:34)
 

Еще раз:

РНР использует корректируемое системное время на плюс/минус установленное вами смещение. SQL же работает по системному времени. И, например, запрос типа 'SELECT NOW()' и функция date('Y-m-d H:i:s') могут вернуть разные результаты, и не обязательно с разницей на час, все будет зависеть от установленной зоны. Чтобы и SQL возвращал такой же результат, нужно установить смещение и для SQL - SET time_zone.

Если вы вносили в базу время не функциями SQL, и в результате получаете разницу в 1 час, то вполне возможно что в чем-то не учтено летнее время, хотя, если речь о нашем времени, то у нас его на данный момент нет.

  Ответить  
 
 автор: Visavi   (04.08.2014 в 15:09)   письмо автору
 
   для: 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 года правильно

  Ответить  
 
 автор: confirm   (04.08.2014 в 17:33)   письмо автору
 
   для: Visavi   (04.08.2014 в 15:09)
 

Ну я же сказал, если пишите дату не средствами SQL, то он не причем, и значит смотрите какое время формирует этот класс.

  Ответить  
 
 автор: Trianon   (04.08.2014 в 19:42)   письмо автору
 
   для: Visavi   (04.08.2014 в 15:09)
 

иными словами, Вы считаете, что в Москве время отличается от UTC на три часа?
Вообще-то это не так.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования