Intereting Posts
Когда использовать статический модификатор в PHP Behat 3: Как получить имя профиля внутри FeatureContext Самый простой способ имитировать отсутствие свободного места на диске? PHP mysql SELECT QUERY с помощью элемента Or Файл изображения Android, отправленный в файл загрузки файла php, – это тип приложения / октета-потока, а не изображение / jpeg? оценка задания в php PhpStorm: получать предупреждения о проверке кода для «Методы с тем же именем, что и их класс, не будут конструкторами» Каков наиболее точный способ получения правильного IP-адреса пользователя в PHP? Используйте PHP или Flash для извлечения кадра из видео PHP cli-скрипт ничего не выводит CakePHP: вызов функции-члена setFlash () для объекта без объекта Как Regex заменить несколько тегов <br /> одним тегом <br />? Как заполнить выпадающий список динамически в symfony? (выберите города региона) Можно ли загружать изображение на сервер с помощью диалогового окна «Модальное окно» Bootstrap, jQuery, AJAX и PHP? Если да, то как? Если нет, в чем причина? Создание субдоменов «на лету» с помощью .htaccess (PHP)

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 на стороне сервера).

Поэтому я хотел бы предоставить 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;
  • Поскольку вы используете PHP> 5.3. вас может заинтересовать новый объект DateTime .

Проблема заключается в том, что вы написали:

 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?