im, используя php 5.4.6 и MySQL 5.5.29, и я получаю проблемы, преобразовывая UNIX TIMESTAMP в MYSQL DATETIME и наоборот. Mysql и php wun на том же локальном компьютере.
У меня простая таблица mysql
CREATE TABLE Entry( id SERIAL PRIMARY KEY, created DATETIME NOT NULL);
Для вставки данных я использую php PDO и mysql NOW (). Это прекрасно работает, правильное дата-время хранится в базе данных.
Мой план – работать с временными метками unix на стороне клиента (php & mysql на стороне сервера).
Поэтому я хотел бы предоставить timestamps unix моему клиенту. Поэтому я использую функцию MySql UNIX_TIMESTAMP (), чтобы преобразовать ее непосредственно в запрос.
Итак, пример запроса выглядит так:
SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry
Результат: created = 2013-02-14 20:47:35 TS = 1360871255
Итак, теперь я хочу сделать другой путь, я передаю отметку времени UNIX и хочу сравнить ее с Записями в моей базе данных. К сожалению, я не могу написать скрипт PHP, который работает. Я не знаю почему, но когда я передаю одну и ту же метку времени (1360871255) на PHP, я не получаю 2013-02-14 20:47:35 с помощью этого метода:
public static function toDateTime($unixTimestamp){ return date("Ymd H:m:s", $unixTimestamp); }
Когда я вызываю toDateTime (1360871255), вы вернетесь в 2013-02-14 20:02:35, который не является исходным DateTime.
Я знаю, мне не нужно форматировать 1360871255 в Ymd H: m: s, чтобы использовать его в MYSQL, но 1360871255, кажется, не так, как я ожидал (и возвращался MYSQL UNIX_TIMESTAMP).
То, что я хочу сделать, это простой запрос, который показывает мне записи, которые старше определенной метки времени, что-то простое:
SELECT * FROM Entry WHERE created < 1360871255
но, как я уже упоминал ранее, результат запроса не является ожидаемым, потому что 1360871255, кажется, не соответствует правильному времени.
Я не указываю какой-либо специальный часовой пояс для соединения mysql в php.
Какие-либо предложения?
Ваш формат даты неправильный … i
для минуты, а не m
(месяцев).
return date("Ymd H:i:s", $unixTimestamp);
Несколько примечаний стороны:
$unixTimestamp = $unixTimestamp;
Проблема заключается в том, что вы написали:
return date("Ymd H:m:s", $unixTimestamp);
Вы указываете месяц (м) как в отношении даты, так и времени. Вы должны заменить второй m на i , правильный флаг на часы при использовании date () в PHP.
return date("Ymd H:i:s", $unixTimestamp);
В зависимости от ваших потребностей вы можете найти функцию PHP strtotime () достаточно полезной.
function format_date($str) { $month = array(" ", "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"); $y = explode(' ', $str); $x = explode('-', $y[0]); $date = ""; $m = (int)$x[1]; $m = $month[$m]; $st = array(1, 21, 31); $nd = array(2, 22); $rd = array(3, 23); if(in_array( $x[2], $st)) { $date = $x[2].'st'; } else if(in_array( $x[2], $nd)) { $date .= $x[2].'nd'; } else if(in_array( $x[2], $rd)) { $date .= $x[2].'rd'; } else { $date .= $x[2].'th'; } $date .= ' ' . $m . ', ' . $x[0]; return $date; }
ничего из того и другого. вы должны сохранить временную метку как INT
или BIGINT
потому что, если вы используете формат TIMESTAMP
для mysql, вы никогда не вернете его обратно в int
. Вы можете получить что-то вроде этого 1970-01-01 01:00:00
.
Почему бы просто не использовать функцию FROM_UNIXTIME в mysql?