#php #json #date #datetime
#php #json #Дата #datetime
Вопрос:
мой PHP-скрипт получает «/ Date (1403071826510) /» в качестве даты JSON. Как я могу преобразовать это в PHP Date или DateTime?
это то, что я делаю:
$milliseconds = (int) preg_replace("/[^0-9 ]/", '', $strDate);
return json_encode(Date('d/m/Y h:m',$milliseconds/1000));
но мое приведение возвращает 2147483647 вместо 1403071826510, потому что моя ОС 32 бита.
Есть идеи, как получить дату или DateTime из полученной строки?
Спасибо
Ответ №1:
Удалите миллисекунды ПЕРЕД преобразованием. Поскольку это строка, вы просто удаляете последние 3 цифры, используя substr()
, а затем преобразуете в int
$js_timeval = '1403071826510';
$php_timeval = (int)substr($js_timeval, 0, -3); // 1403071826
echo date('r', $php_timeval);
Wed, 18 Jun 2014 00:10:26 -0600
Ответ №2:
Здесь действительно нет необходимости в регулярном выражении. Вы можете просто извлечь секунды из середины строки и работать с этим:
$sec =substr("/Date(1403071826510)/", 6, 10);
$dt = date("Y-m-d H:i:s",$sec); // 2014-06-18 06:10:26
Учитывая комментарий @zamnuts, вот версия регулярных выражений, которая обрабатывает ранние даты:
preg_match('#Date(([0-9]{0,10}?)([0-9]{1,3}))#',"/Date(1403071826510)/",$matches);
$dt = date("Y-m-d H:i:s", $matches[1]);
Комментарии:
1. Что делать, если дата 1 января 1970 года, 18:20 утра? В этом случае временная метка равна просто 500 секундам (500000 мс), и использование
substr
недостаточно.2. @zamnuts Достаточно верно, но мы не знаем, какой диапазон дат здесь задействован. На практике мне не приходилось иметь дело с датой, на которую это повлияло бы, больше лет, чем я могу вспомнить.
Ответ №3:
Ответ Марка Б. работает просто отлично ( 1), но для полноты картины (и поскольку я уже выполнил эту работу) я думал использовать расширение BC Math для PHP, которое должно быть установлено и не включено по умолчанию. BC Math позволяет PHP работать с произвольно большими числами.
Рассмотрим следующее:
$input = '/Date(1403071826510)/';
$ms = preg_replace('/[^0-9 ]/','',$input);
var_dump($ms); // string '1403071826510' (length=13)
$sec = bcdiv($ms,'1000');
var_dump($sec); // string '1403071826' (length=10)
$date = Date('d/m/Y h:m',$sec);
var_dump($date); // string '17/06/2014 11:06' (length=16)
Все преобразования используют String
. Разделите проанализированные миллисекунды с помощью bcdiv на '1000'
и передайте это в Date
качестве метки времени секунд.