1

需要使用 PHP 以以下格式在 JSON 帖子中发送日期

\/Date(410256000000-0800)\/

如何在 PHP 中将标准dd-mm-yyyy h:i:s 日期时间转换01-01-2013 12:00:00为该格式?只需要知道哪些值对应于该格式的内容,而不是真正寻找stringify事物的答案。

4

2 回答 2

3

这应该这样做:

$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)\/'

我让你自己找出格式UO做什么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。当然,不了解此约定的解析器只会看到一个字符串,但知道的解析器将能够将它们解析为日期,而不会出现误报的风险

于 2013-06-26T09:18:33.747 回答
2

我们为此创建了一个包: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)/'
于 2020-07-08T11:30:28.820 回答