PHP-MYSQL: преобразование метки времени Unix в DateTime и наоборот
im, используя php 5.4.6 и MySQL 5.5.29, и я получаю проблемы, Преобразуя временную метку UNIX в MySQL DATETIME и наоборот. Mysql и php wun на одной локальной машине.
у меня есть простая таблица MySQL
CREATE TABLE Entry(
id SERIAL PRIMARY KEY,
created DATETIME NOT NULL);
для вставки данных я использую php PDO и mysql NOW(). Это отлично работает, правильное datetime хранится в базе данных.
мой план-работать с метками времени unix на стороне клиента (php & mysql на стороне сервера).
поэтому я хотел бы доставьте метки времени unix моему клиенту. Поэтому я использую функцию MySql UNIX_TIMESTAMP (), чтобы преобразовать ее непосредственно в запросе.
таким образом, пример запроса выглядит следующим образом:
SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry
результат: создал = 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("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.
какие предложения?
5 ответов
код дата в формате - это неправильно... i
на минуту, не m
(месяцев).
return date("Y-m-d H:i:s", $unixTimestamp);
несколько заметок:
- нет необходимости повторно назначать, т. е.
$unixTimestamp = $unixTimestamp;
- так как вы используете PHP > 5.3. вы можете быть заинтересованы в новом DateTime
проблема заключается в функции, которую вы написали:
return date("Y-m-d H:m:s", $unixTimestamp);
вы указываете месяц (m) в обеих частях даты и времени. Вы должны заменить второй m С Я, правильный флаг в течение нескольких часов при использовании date () в PHP.
return date("Y-m-d 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
.