Дата PHP/фармат даты (1365004652303-0500) /

Я тэлефаную ў API, адкуль я атрымліваю дату /Дата (1365004652303-0500)/, я не разумею, які фармат гэта. Як называецца гэты фармат даты? Я не быў упэўнены, што Google для такога тыпу фармату.

Можа хто-небудзь дапамагчы мне ў атрыманні гэтай даты ў Y-м-д Н: Я: s фармат?

The API I am calling is on .NET server. And when I call it using PHP's file_get_contents and json_decode it gives me the following Date format for created date: /Date(1365004652303-0500)/

19
@hakre: /Дата (1365004652303 + 0500)/?
дададзена аўтар zerkms, крыніца
дададзена аўтар zerkms, крыніца
Дзіўна, што пра гэта адзнакі часу з'яўляецца тое, што ён знаходзіцца ў мілісекундах. Калі падзяліць на 1000, вы бачыце, больш разумнае колькасць. Гэта тое, што мяне ў тупік на першы.
дададзена аўтар Scott C Wilson, крыніца
магчыма дублікат Ці можа аб'ект JSON, вернуты PHP ўтрымліваць дату аб'екта
дададзена аўтар Gajus, крыніца
Гэта пазнака часу UNIX. Перад вываду вашага JSON пераўтварыць яго з UNIX на звычайную радок даты і часу.
дададзена аўтар sed, крыніца
Цалкам думаю, што вы выбралі няправільны адказ.
дададзена аўтар Jimbo, крыніца
@Kalpesh Мехта: Да таго часу, пакуль вы не сказаць, што GMT зрушэнне вашага Y-м-д Н: я: s фармат, гэта тэхнічна немагчыма адказаць на ваша пытанне.
дададзена аўтар hakre, крыніца
@KalpeshMehta: Зноў жа: Якія API? Спасылка калі ласка! «Got вырашана» зьяўляецца ня-кажучы, ён ужо не было вырашана раней на гэтым сайце, вы проста прапусцілі, каб зразумець, у чым праблема. Калі вы будзеце так ласкавы, каб даць больш спасылак з вашым пытаннем, гэта значыць больш на будучыню, чым проста задавальненне ўчорашняга.
дададзена аўтар hakre, крыніца
Гэта не так шмат пра дзяліць URL, але больш канкрэтыкі. напрыклад які JSON серыялізацыі бібліятэка выкарыстоўваецца ў .NET гэтага API?
дададзена аўтар hakre, крыніца
Калі ласка, дадайце больш інфармацыі, якая API гэта.
дададзена аўтар hakre, крыніца
Ну, гэта адзін варыянт я бачу, а таксама /Дата (13650046523030500)/, а яшчэ вось дзе пачынаецца самае цікавае :)
дададзена аўтар hakre, крыніца
Самае цікавае было б убачыць прыклад з станоўчым зрухам гадзіннага пояса. Як гэта выглядае, як тады?
дададзена аўтар hakre, крыніца
Часовая пазнака UNIX з зрушэнне гадзіннага пояса
дададзена аўтар hek2mgl, крыніца
@KalpeshMehta - Ці можаце вы перайсці адзнаку ў адказ Бабы, так што я магу выдаліць мой? Дзякуючы.
дададзена аўтар Steven Moseley, крыніца
@StevenMoseley Гатова. Дзякуй за тое, сумленнае слова!
дададзена аўтар Kalpesh, крыніца
@hakre Ok проста абнавіў пытанне. На самай справе гэта на .NET сервер і ўнутраны праект нашай кампаніі, так што я не магу даць URL. І як я толькі аб пераўтварэнні даты, я даў ўзор дня я атрымліваў.
дададзена аўтар Kalpesh, крыніца
@hakre гэта ўдалося вырашыць, выкарыстоўваючы адказы Бабы і Стывена. Я хацеў GMT-5-й гадзіне
дададзена аўтар Kalpesh, крыніца

7 адказы

Перш за ўсё, неабходна зразумець фармат, які вы маеце

/Date(1365004652303-0500)/

Тады ў вас ёсць

    <�Літый> пазнака часу (U) = 1365004652 <�Літый> мілісекунды (і) = 303 <�Літый> Розніца ў Грынвіч часу (паводле Грынвіча) (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');
22
дададзена
@Baba: Extended.
дададзена аўтар hakre, крыніца
@hakre фіксаванай .....
дададзена аўтар Baba, крыніца
@KalpeshMehta звярніце ўвагу, што 0500 ня гадзінны пояс не дазваляйце нікому збіць вас з панталыку
дададзена аўтар Baba, крыніца
@StevenMoseley мой англійская дрэнна, але PHP док кажа ˙U з'яўляецца мікрасекунды (дададзена ў PHP 5.2.2). Звярніце ўвагу, што дата() заўсёды будзе генераваць 000000, бо ён прымае цэлалікавых параметр, у той час як DateTime фармат ::() не падтрымліваюць мікрасекунды ....
дададзена аўтар Baba, крыніца
Я дадаў $ dt-> поўдзень (новы DateInterval ( 'PT5H')); адразу пасля $ Да й = Datetime :: createFromFormat .. адняць 5 гадзін з даты і гэта працуе.
дададзена аўтар Kalpesh, крыніца

Паспрабуйце гэта:

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"
6
дададзена
Гэта правільны адказ. Мой адказ атрымлівае часовую зону ад зрушэння, але не правільна ўлічвае зберажэнні дзённага святла.
дададзена аўтар Steven Moseley, крыніца
Будзьце асцярожныя: гэта прывядзе да некарэктным канверсіі, калі гадзіну ўтрымлівае хвілін, а таксама, як 0930. Павінен падзяліць гадзіны і хвіліны і зрабіць разлік правільна.
дададзена аўтар Ghigo, крыніца

Давайце разбярэм /Дата (1365004652303-0500)/ ўніз:

  • Дата
  • 1365004652303
  • -0500

Першы радок робіць сябе даволі ясна.

Наступнае вялікі лік з'яўляецца значэннем эпохі

-0500 ўяўляе сабой гадзінны пояс, у якім тэрміны былі першапачаткова захоўваліся. Гэта ў параўнанні з UTC, і, такім чынам, ён мае на ўвазе па ўсходнім паясны часу.


EDIT

Эпоха з дакладнасцю milisecond. Паспрабуйце гэты код:

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

You can also use the timezone for setting the date relative to your own. http://codepad.viper-7.com/RrSkMy

4
дададзена
@KalpeshMehta Не турбуйцеся, тут яшчэ лепшы спосаб ;)
дададзена аўтар Jimbo, крыніца
@KalpeshMehta Праверце рэдагаванне
дададзена аўтар hjpotter92, крыніца
@Jimbo Ён ніколі не старэе: P
дададзена аўтар hjpotter92, крыніца
@KalpeshMehta Як я ўжо казаў у адказ :. <�Я> Вы можаце таксама выкарыстоўваць гадзінны пояс для ўстаноўкі даты адносна самастойна
дададзена аўтар hjpotter92, крыніца
@ Hjpotter92 - Гэта добра, калі гадзінны пояс у дата устанаўліваецца самастойна. Што адбудзецца, калі ён атрымлівае час са зрушэннем -0800 і ён у EST?
дададзена аўтар Steven Moseley, крыніца
@Jimbo Дзякуй за мяне вучыць, як гугліць :)
дададзена аўтар Kalpesh, крыніца
@ Hjpotter92 ок дзякуй
дададзена аўтар Kalpesh, крыніца
@ Hjpotter92 выхад на 5 гадзін больш .. можа быць з-за часовую зону.
дададзена аўтар Kalpesh, крыніца
Дзякуй за інфармацыю. Любы спосаб фарматавання яго У-м-д Н: Я: сек ?
дададзена аўтар Kalpesh, крыніца

Гэтая пазнака часу ў мілісекундах, таму ён такі вялікі.

Вы можаце выкарыстоўваць PHP дату () для фарматавання гэтай пазнакі часу, як вы хочаце. Проста падзяліць на 1000 першай. У стандартным фармаце ЗША, было б

$ MyDate = дата ( 'м д Y', $ часовая пазнака);

(Дзе $ часовая адзнака 1365004652303)

Для фарматавання яго ў фармаце запытанай (Y-м-d H: I: сек), якое будзе выкарыстана 'Y-м-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 ўяўляе сабой зрушэнне; калі так, то вы хочаце наладзіць $ штэмпеля [0] адпаведна.

2
дададзена

Калі дата, як /Дата (-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
1
дададзена

У наступным прыкладзе выкарыстоўваецца 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');
0
дададзена
@Baba: Аб ?? Які PHP версіі?
дададзена аўтар hek2mgl, крыніца
У мяне ёсць 64 разраднай сістэма. Не ведаю, што (Int) і (цэлы лік), паводзяць сябе па-рознаму
дададзена аўтар hek2mgl, крыніца
<�Код> (цэлы лік) $ адпавядае [1]; церпяць няўдачу
дададзена аўтар Baba, крыніца
32 бітная сістэма ... (INT) $ адпавядае [1]; б заўсёды вяртаўся PHP_INT_MAX
дададзена аўтар Baba, крыніца

У мяне былі некаторыя крыху іншы вопыт, які прывёў мяне, каб зрабіць пару невялікіх змяненняў у выдатным адказ Бабы.

Выкарыстоўваючы бібліятэку JSON Newtonsoft для кадавання паведамленняў у .NET, якія я затым адправіць на наш сайт (РНР частка), я атрымліваю прабел перад зрушэннем гадзіннага пояса, а не +/- характару.

Я таксама бачыў адмоўныя лікі ад даты да эпохі, якая азначае, што мне трэба, каб абслужыць для - знак перад значэннем мілісекунды.

Я змяніў рэгулярны выраз для гэтага, і гэта выдатна працуе для мяне:

<�Код> ^/Дата (([-] \ d {10}) (\ d {3}) \ с ([+ -] ?? \ Д {4}))/$

два адрозненні

[-]? before the 10-digit millisecond value, and \s? before the timezone offset.

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

0
дададзена