как преобразовать строку в date или datetime в php

#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 качестве метки времени секунд.