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

Формат даты в формате PHP/Дата (1365004652303-0500)/

Я вызываю API, откуда я получаю дату /Date(1365004652303-0500)/, я не понимаю, какой формат это. Как называется этот формат даты? Я не был уверен, что делать с Google для такого типа.

Может ли кто-нибудь помочь мне получить эту дату в формате Y-m-d H:i:s?

API, на который я звоню, находится на сервере .NET. И когда я называю это с помощью PHP file_get_contents и json_decode, он дает мне следующий формат даты для созданной даты: /Date(1365004652303-0500)/

4b9b3361

Ответ 1

Сначала вам нужно понять формат, который у вас есть

/Date(1365004652303-0500)/

Тогда у вас есть

  • отметка времени (U) = 1365004652
  • Миллисекунды (u) = 303
  • Отличие от времени в Гринвиче (GMT) (O) = -0500

Создать формат

$date = '/Date(1365004652303-0500)/';
preg_match('/(\d{10})(\d{3})([\+\-]\d{4})/', $date, $matches);
$dt = DateTime::createFromFormat("U.u.O",vsprintf('%2$s.%3$s.%4$s', $matches));
echo $dt->format('r');

Выход

Wed, 03 Apr 2013 15:57:32 -0500
                            ^
                            |= Can you see the GMT ? 

interface DateFormatParser
{
    /**
     * @param $string
     *
     * @return DateTime
     */
    public function parse($string);

}

abstract class PregDateParser implements DateFormatParser
{
    protected $pattern, $format, $mask;

    public function parse($string) {
        $string = (string)$string;

        $pattern = $this->pattern;
        $format  = $this->format;
        $mask    = $this->mask;

        $r = preg_match($pattern, $string, $matches);
        if (!$r) {
            throw new UnexpectedValueException('Preg Regex Pattern failed.');
        }
        $buffer = vsprintf($mask, $matches);
        $result = DateTime::createFromFormat($format, $buffer);
        if (!$result) {
            throw new UnexpectedValueException(sprintf('Failed To Create from Format "%s" for "%s".', $format, $buffer));
        }
        return $result;
    }
}

class JsonTimestampWithOffsetParser extends PregDateParser
{
    protected $pattern = '/^\/Date\((\d{10})(\d{3})([+-]\d{4})\)\/$/';
    protected $format  = 'U.u.O';
    protected $mask    = '%2$s.%3$s.%4$s';
}

$date   = '/Date(1365004652303-0500)/';
$parser = new JsonTimestampWithOffsetParser;
$dt     = $parser->parse($date);

echo $dt->format('r');

Ответ 2

Попробуйте следующее:

var_dump(date('Y-m-d H:i:s', '1365004652303'/1000));
$str = '/Date(1365004652303-0500)/';

$match = preg_match('/\/Date\((\d+)([-+])(\d+)\)\//', $str, $date);

$timestamp = $date[1]/1000;
$operator = $date[2];
$hours = $date[3]*36; // Get the seconds

$datetime = new DateTime();

$datetime->setTimestamp($timestamp);
$datetime->modify($operator . $hours . ' seconds');
var_dump($datetime->format('Y-m-d H:i:s'));

Возврат:

string(19) "2013-04-03 17:57:32"
string(19) "2013-04-03 12:57:32"

Ответ 3

Пусть сломается /Date(1365004652303-0500)/ до:

  • Дата
  • 1365004652303
  • -0500

Первая строка становится понятной.

Следующее большое число - это значение эпохи

-0500 представляет собой часовой пояс, в котором даты были первоначально сохранены. Это относительно UTC, и, следовательно, это относится к Восточному стандарту времени.


ИЗМЕНИТЬ

Эпоха с миллисекундной точностью. Попробуйте этот код:

<?php
    $str = "/Date(1365004652303-0500)/";
    preg_match( "#/Date\((\d{10})\d{3}(.*?)\)/#", $str, $match );
    echo date( "r", $match[1] );
?>

Вы также можете использовать часовой пояс для установки даты относительно вашей. http://codepad.viper-7.com/RrSkMy

Ответ 4

Эта метка времени находится в миллисекундах, поэтому она настолько велика.

Вы можете использовать вызов PHP date() для форматирования этой метки времени по своему усмотрению. Сначала разделите на 1000. В стандартном формате США это будет

$mydate = date ('m d Y', $timestamp);

(где $timestamp - 1365004652303)

Чтобы отформатировать его в запрошенном формате (Y-m-d H: i: s), вы должны использовать "Y-m-d H: i: s" в качестве строки формата (первый параметр). Отбросьте текст, начинающийся с "-".

$stamps = preg_split("/-/", $time);
$stamps[0] = $stamps[0]/1000; 
$mydate = date('Y-m-d H:i:s', $stamps[0]); 

Это дает 2013-04-03 11:57:32

Другие предположили, что 0500 является смещением; если это так, вы хотите настроить $stamp [0] соответственно.

Ответ 5

Если ваша дата похожа на /Date(-62135578800000)/, положительное или отрицательное целое число без часовой пояс:

$date = substr('/Date(-62135578800000)/', 6, -5);
$date = date('m/d/Y H:i:s', $date + date('Z', $date) * -1);
// 01/01/0001 05:00:00

Ответ 6

В следующем примере используются классы preg_match() и DateTime:

$date = '/Date(1365004652303-0500)/';

// get the timestamp
$pattern = '~/Date\(([0-9]*)~';
preg_match($pattern, $date, $matches);
$timestamp = round(((int) $matches[1]) / 1000);

$dt = new DateTime();
$dt->setTimestamp($timestamp);

echo $dt->format('Y-m-d H:i:s');

Ответ 7

У меня был немного иной опыт, который заставил меня сделать пару незначительных изменений в превосходном ответе Бабы.

Используя библиотеку Newtonsoft JSON для кодирования сообщений в .NET, которую я затем отправляю на наш сайт (часть PHP), я получаю пробел до смещения часового пояса и символ +/-.

Я также видел отрицательные числа от дат до эпохи, что означает, что мне нужно обслуживать знак до знака миллисекунды.

Я изменил это регулярное выражение, и он отлично работает для меня:

^/Date(([-]?\d{10})(\d{3})\s?([+-]?\d{4}))/$

Два отличия:

[-]? до десятизначного миллисекундного значения и \s? до смещения часового пояса.

Я бы поставил это как комментарий к ответу Бабы, но моя нехватка репутации не позволяет мне. Я надеюсь, что это уместно для меня, чтобы опубликовать здесь, поскольку я думал, что это может быть полезно.