Подтвердить что ты не робот

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.

Любые предложения?

4b9b3361

Ответ 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?