PHP mySQL - UNIX_TIMESTAMP не равен strtotime - PullRequest
2 голосов
/ 05 января 2010

ПЛАТФОРМА: PHP и MySQL

Я храню дату + время в базе данных в следующем формате: date ("Y-m-d H: i: s"). Пример значения, которое у меня есть в моей БД: 2010-01-05 07:36:33. В моем сценарии я установил часовой пояс как date_default_timezone_set("America/Chicago");

ПРОБЛЕМА:

Я где-то читал о UNIX_TIMESTAMP, и я использовал это в своем запросе. Значение UNIX_TIMESTAMP для значения даты из БД, похоже, отличается от strotime (Значение даты в БД).

Пример:

Учтите, что одним из значений БД для столбца даты в моей БД является 2010-01-05 07: 36: 33 Теперь, если я получу эту дату следующим образом:

$result = mysql_query("SELECT date, UNIX_TIMESTAMP(date) AS ut_date FROM table");
$row = mysql_fetch_row($result);

//The result of this is:
$row['date']    = 2010-01-05 07:36:33
$row['ut_date'] = 1262657193
strtotime($row['date']) gives 1262698593

Для дальнейших вычислений в приложении мне нужно работать с strtotime (date). У меня есть много сравнений, чтобы сделать это. Моя проблема была бы решена, если бы UNIX_TIMESTAMP (дата) был таким же, как strtotime (дата). Один из примеров запроса, с которым мне нужно работать, это:

$gap = 1; // time in minutes
$tm2 = date ("Y-m-d H:i:s", mktime (date("H"),date("i")-$gap,date("s"),date("m"),date("d"),date("Y")));
$target = strtotime($tm2);

$result2 = mysql_query("UPDATE table2 SET stat = 0 WHERE UNIX_TIMESTAMP(today_login_time) < $target ");

Выше приведены неверные результаты. Если я попытаюсь заменить UNIX_TIMESTAMP на strtotime в приведенном выше запросе, это выдаст мне ошибку, так как функция strtotime кажется функцией PHP, а не соответствующей функцией mySQL. Есть ли соответствующая функция MySQL для strtotime? Как мне решить вышеуказанную проблему? Код для решения вышеуказанной проблемы высоко ценится.

Заранее спасибо.

Ответы [ 4 ]

7 голосов
/ 05 января 2010

Возможно, часовые пояса вашего сервера MySQL и вашего экземпляра php отличаются. например,

echo date('Y-m-d H:i:s T', 1262657193);

печатает на моем компьютере 2010-01-05 03:06:33 CET (обратите внимание на часовой пояс CET, это UTC + 1), в то время как ваш сервер MySQL интерпретирует ту же метку времени Unix, что и 2010-01-05 07:36:33

см. http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html
и http://docs.php.net/datetime.configuration#ini.date.timezone

1 голос
/ 05 января 2010

Поскольку разница составляет ровно 11,5 часов, похоже, у вас проблемы с часовыми поясами.

1 голос
/ 05 января 2010

вам не нужно преобразовывать метку времени sql в unix для запроса where. просто используйте DATE_FORMAT, это упрощает задачу:

 WHERE DATE_FORMAT(`today_login_time`, "%Y-%m-%d") < '.date('Y-m-d', $my_tsp)
0 голосов
/ 05 января 2010

Формат даты («Y-m-d H: i: s») не точно описывает дату и время, поскольку он не включает часовой пояс. Поскольку часовой пояс не указан, и веб-сервер, и база данных используют свои часовые пояса, которые явно различаются.

Вы должны рассмотреть вопрос о сохранении дат в базе данных в качестве метки времени Unix. Отметка времени Unix - это просто количество секунд, прошедших с начала эпохи Unix (1 января 1970 г., 00:00:00 по Гринвичу). На это не влияют часовые пояса или летнее время. Таким образом, вам придется беспокоиться только о часовых поясах и переходе на летнее время при переходе на фактические календарные дни и время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...