PHP-MYSQL: преобразование временной отметки Unix в DateTime и наоборот
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 на стороне сервера).
Итак, я хотел бы предоставить временные метки unix моему клиенту.
Поэтому я использую функцию MySql UNIX_TIMESTAMP(), чтобы преобразовать ее непосредственно в запрос.
Итак, пример запроса выглядит так:
SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry
Результат:
created = 2013-02-14 20:47:35
TS = 1360871255
Итак, теперь я хочу сделать другой путь, я передаю временную метку UNIX и хочу сравнить ее с Записями в моей базе данных. К сожалению, мне не удалось написать PHP script, который работает. Я не знаю почему, но когда я передаю одну и ту же метку времени (1360871255) в PHP, я не получаю 2013-02-14 20:47:35 с помощью этого метода:
public static function toDateTime($unixTimestamp){
return date("Y-m-d H:m:s", $unixTimestamp);
}
Когда я вызываю toDateTime (1360871255), вы вернетесь в 2013-02-14 20:02:35, который не является исходным DateTime.
Я знаю, мне не нужно форматировать 1360871255 на Y-m-d H: m: s, чтобы использовать его в MYSQL, но 1360871255, кажется, не так, как я ожидал (и возвращался MYSQL UNIX_TIMESTAMP).
Что я хочу сделать, это простой запрос, который показывает мне записи, которые старше определенной метки времени, что-то простое:
SELECT * FROM Entry WHERE created < 1360871255
но, как я уже упоминал ранее, результат запроса не является ожидаемым, потому что 1360871255, похоже, не соответствует правильному времени.
Я не указываю какой-либо специальный часовой пояс для соединения mysql в php.
Любые предложения?
Ответы
Ответ 1
Ваш формат даты... неправильный... i
- минута, а не m
(месяцы).
return date("Y-m-d H:i:s", $unixTimestamp);
Несколько примечаний:
- Нет необходимости переписывать, т.е.
$unixTimestamp = $unixTimestamp;
- Поскольку вы используете PHP > 5.3. вы можете быть заинтересованы в новом DateTime объекте.
Ответ 2
Проблема заключается в том, что вы написали:
return date("Y-m-d H:m:s", $unixTimestamp);
Вы указываете месяц (м) как в части даты, так и во времени. Вы должны заменить второй m на i, правильный флаг в течение нескольких часов при использовании date() в PHP.
return date("Y-m-d H:i:s", $unixTimestamp);
В зависимости от ваших потребностей вы можете найти функцию PHP strtotime() достаточно полезной.
Ответ 3
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;
}
Ответ 4
ничего из того и другого. вы должны сохранить временную метку как INT
или BIGINT
, потому что если вы используете формат TIMESTAMP
mysql, вы никогда не вернетесь к INT
. Вы можете получить только что-то вроде 1970-01-01 01:00:00
.
Ответ 5
Почему бы просто не использовать функцию FROM_UNIXTIME в mysql?