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() достаточно полезной.


Почему бы просто не использовать функцию FROM_UNIXTIME в mysql ?


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.