2013-05-13 4 views
0

Привет, у меня есть система голосования.Текущее время + 12 часов

Как только человек голосует, у меня есть столбец с именем «nextVote».

Эта колонка будет содержать дату, когда пользователь может проголосовать снова. В этой колонке я смогу повторить, сколько часов/минут ему нужно подождать до голосования.

Это моя попытка:

public final function setNextVote($ip) 
    { 
     $this->insert = $this->pdo->prepare("UPDATE auths SET nextVote = NOW() + INTERVAL 12 HOUR WHERE voter_ip = :ip"); 
     $this->insert->execute(array(":ip" => $ip)); 
    } 

И то, что он хранит:

2013-05-14 05:56:24 

Почему ..

То, что я пытаюсь сделать, это: текущее время + 12 часов.

Если сегодня 2013, 05, 14 и 12:00.

В 12 часов было бы

2013, 05, 14, 24:00 Почему не это делает?

public function getTimeLeft($ip) 
    { 
     $this->get = $this->pdo->prepare 
     (" 
      SELECT TIMESTAMPDIFF(MINUTE, `nextVote`, NOW()) 
      FROM auths 
      WHERE `voter_ip` = :ip 
     "); 
     $echo = $this->get->execute(array(":ip" => $ip)); 

     return $echo; 
    } 
+0

Вы имеете в виду через 12 часов это будет 2013-05-15 00:00:00? – Josh

+1

Используется время UNIX, которое является GMT. В настоящее время 18:02 в часовой пояс GMT. Добавив к этому 12 часов, это будет 06:02 утра, что и указывает ваш результат. – Overv

+0

Да. Вот и все. – user2363542

ответ

1

Ваша база данных использует GMT, вы можете изменить часовой пояс в базе данных, но это может быть сложно на производственной машине, если другие вещи ее используют. Он должен решить проблему. Или попробуйте это

$date = date('Y-m-d H:i:s', strtotime('now +12 hours')); 
$sql = "UPDATE auths SET nextVote = '{$date}' WHERE voter_ip = :ip"; 

, если вы хотите обновить свой часовой пояс (и на убунту), запустите dkpg-reconfigure tzdata

+0

Могу ли я использовать что-то еще, чем СЕЙЧАС()? – user2363542

+0

Вы можете использовать функцию даты php – Ascherer

+0

сделал редактирование сообщения – Ascherer

1

Проблема в том, что вы ожидаете результата в локальном часовом поясе. MySQL по умолчанию использует системный часовой пояс для создания метки времени при вызове NOW() или любых других связанных с ним функций времени и даты.

Вы можете изменить часовой пояс на сервере, передав параметр --timezone MySQL, как описано here.

Однако часовой пояс не относится к вашему приложению, потому что вас интересует только относительное время. Пользователи вашего приложения могут быть в любой временной зоне, поэтому нет смысла предполагать конкретный.

+0

неверный. http://stackoverflow.com/questions/1445702/what-timezone-does-mysqls-now-follow. 'NOW()' следует по часовой пояс системы – Ascherer

+0

@Ascherer Вы правы!Я просто изменил свой ответ, извините :) – Overv

+0

Вы по-прежнему говорите, что по умолчанию использует GMT, но это не так. по умолчанию используется системный часовой пояс. Кроме того, его плохое предположение о том, что OP имеет пользователей из нескольких часовых поясов – Ascherer

0

Если вы хотите следующую дату, чтобы быть на границе в день ... В отличие от 12 часы отныне до минуты - вы можете обернуть DATE() вокруг вашего математического результата, который будет обрезать его до даты только для поля datetime.

UPDATE auths SET nextVote = DATE(DATE_ADD(NOW(), INTERVAL 1 DAY)) WHERE voter_ip = :ip 
Смежные вопросы