需要使用 PHP 以以下格式在 JSON 帖子中发送日期
\/Date(410256000000-0800)\/
如何在 PHP 中将标准dd-mm-yyyy h:i:s
日期时间转换01-01-2013 12:00:00
为该格式?只需要知道哪些值对应于该格式的内容,而不是真正寻找stringify
事物的答案。
这应该这样做:
$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执行的操作。
另一种方法是使用 PHP 的DOTNET API 并DataContractJsonSerializer
直接从 PHP 中使用该类。但是,您需要在服务器上安装 .NET 并且使用 PHP 的 DOTNET API 相当晦涩难懂。
更有趣的部分是为什么你需要这种格式。这在http://weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx的博文中进行了解释
但是由于 EcmaScript 规范中的一个奇怪的疏忽,没有标准的方式来描述 JSON 中的日期。[…] 我们当前的方法是利用 JSON 规范中的一个小漏洞。在 JSON 字符串文字中,您可能(也可能不会)转义某些字符。在这些字符中,奇怪的是,有斜线字符('/')。[…] 新格式是“/Date(1198908717056)/”,其中数字再次是自 1970 年 1 月 1 日 UTC 以来的毫秒数 […] 关键是这消除了日期文字与看起来像相同日期的字符串的歧义文字,同时保留将由任何标准 JSON 解析器解析的纯 JSON。当然,不了解此约定的解析器只会看到一个字符串,但知道的解析器将能够将它们解析为日期,而不会出现误报的风险
我们为此创建了一个包:https ://github.com/webapix/dot-net-json-date-formatter
它使用与上一个答案类似的方法,在 PHP 版本 >= 5.6 上进行了测试。
use DateTime;
use DateTimeZone;
use Webapix\DotNetJsonDate\Date;
$date = DateTime::createFromFormat(
'd-m-Y H:i:s',
'01-01-2013 12:00:00',
new DateTimeZone('+0000')
);
Date::toJsonDate($date); // returns '/Date(1357041600000+0000)/'