2013-06-26 2 views
1

Существует требование, чтобы отправить дату внутри JSON пост с помощью PHP в этом форматеКак отформатировать дату PHP в формате .Net DataContractJsonSerializer?

\/Date(410256000000-0800)\/ 

Как преобразовать стандартный dd-mm-yyyy h:i:s DateTime как 01-01-2013 12:00:00 в этом формате в PHP? Просто нужно знать, какие значения соответствуют тому, что в этом формате, на самом деле не найти ответ stringify.

+1

что это за номер '410256000000-0800' должен представлять? мы не можем [преобразовать его, если мы не знаем формат] (http://php.net/date). – Gordon

+0

Да, это мой вопрос, действительно, если кто-то знает, что представляет этот формат? Согласно некоторым исследованиям, это формат .Net DataContractJsonSerializer –

+1

, он должен быть 'u' настолько большим. просто догадались ли вы попробовать 'u'? – DevZer0

ответ

4

Это следует сделать это:

$dateTime = DateTime::createFromFormat('d-m-Y H:i:s', '01-01-2013 12:00:00'); 

$requiredJsonFormat = sprintf(
    '\/Date(%s%s)\/', 
    $dateTime->format('U') * 1000, 
    $dateTime->format('O') 
); 

echo $requiredJsonFormat; // prints '\/Date(1357038000000+0100)\/' 

я оставляю это до вас, чтобы найти то, что форматы U и O сделать из http://php.net/date.

Альтернативой может быть использование API DOTNET PHP и использование класса DataContractJsonSerializer непосредственно из PHP. Тем не менее, вам понадобится .NET, установленный на сервере, и использование API DOTNET PHP довольно загадочно.

Более интересная часть - это то, почему вам нужен этот формат вообще. Это объясняется в BlogPost на http://weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx

Но из-за странного надзора в ECMAScript спецификации, нет стандартного способа описания даты в формате JSON. [...] Наш нынешний подход использует небольшую лазейку в спецификациях JSON. В строковом литерале JSON вы можете (или не можете) сбегать от некоторых символов. Среди этих символов, как ни странно, есть символ косой черты ('/'). [...] Новый формат: «/ Date (1198908717056) /», где число снова составляет миллисекунды с 1 января 1970 года UTC [...] Дело в том, что это устраняет неоднозначность литерала даты из строки, которая похожа на ту же дату буквально, оставаясь чистым JSON, который будет анализироваться любым стандартным парсером JSON. Разумеется, синтаксический анализатор, который не знает об этом соглашении, просто увидит строку, но синтаксические анализаторы, которые это сделают, смогут анализировать их как даты без риска ложных срабатываний.

+0

Спасибо Гордону за то, что нашли время для исследования этого. Так что это очень ценно. Ваш ответ очень полезен –