PHP日期格式/日期(1365004652303-0500)/

PHP日期格式/日期(1365004652303-0500)/,php,json,date,Php,Json,Date,我正在调用一个API,从中获取日期/date(1365004652303-0500)/,我不明白这是什么格式。这个日期格式叫什么?我不知道用谷歌搜索这种格式需要什么 有谁能帮我把这个日期写成Y-m-d H:i:s格式吗 我正在调用的API位于.NET服务器上。当我使用PHP的文件\u get\u contents和json\u decode调用它时,它为创建日期提供了以下日期格式:/Date(1365004652303-0500)/让我们把/Date(1365004652303-0500)/分解

我正在调用一个API,从中获取日期
/date(1365004652303-0500)/
,我不明白这是什么格式。这个日期格式叫什么?我不知道用谷歌搜索这种格式需要什么

有谁能帮我把这个日期写成
Y-m-d H:i:s
格式吗

我正在调用的API位于.NET服务器上。当我使用PHP的
文件\u get\u contents
json\u decode
调用它时,它为创建日期提供了以下日期格式:
/Date(1365004652303-0500)/
让我们把
/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] );
?>


您还可以使用时区设置与您自己的时区相对的日期

这个时间戳以毫秒为单位,这就是它如此大的原因

您可以使用PHP()调用根据需要格式化此时间戳。先除以1000。在标准的美国格式中,它将是

$mydate=date('mdy',$timestamp)

(其中$timestamp为1365004652303)

要将其格式化为您请求的格式(Y-m-dh:i:s),可以使用“Y-m-dh:i:s”作为格式字符串(第一个参数)。切掉以“-”开头的文本

这将产生2013-04-03 11:57:32


其他人则认为0500是一种补偿;如果是这样,您需要相应地调整$stamps[0]

以下示例使用了
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');

首先,你需要了解你的格式

/Date(1365004652303-0500)/
那你有

  • 时间戳(U)=1365004652
  • 毫秒(u)=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 ? 

试试这个:

返回:

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

如果您的日期类似于
/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

我有一些稍有不同的经历,这让我对爸爸的优秀答案做了一些细微的改变

使用Newtonsoft的JSON库在.NET中对消息进行编码,然后将其发送到我们的网站(PHP部分),我得到了时区偏移量之前的一个空格,并且没有+/-字符

我还看到了前大纪元时期的负数,这意味着我需要在毫秒值之前考虑a符号

我把正则表达式改成了这个,它对我来说非常适合:

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

这两个区别是

[-]?
在10位毫秒值之前,以及
\s?
在时区偏移之前

我想把这作为对爸爸回答的一个评论,但我的名誉不允许我这样做。我希望这篇文章适合我在这里发表,因为我认为它可能有用。

非常有用,但它不包括我需要的3个案例:

  • 时间戳可以是负数
  • 时间戳可以小于10位
  • 可能缺少GMT偏移量
这是我用来获取时间戳的:

$date_string = '/Date(-594262800300+0100)/';
preg_match('/([+-]?\d+)([+-]\d{4})?/', $date_string, $matches);
$timestamp = $matches[1] / 1000;
$hours = $matches[2] * 36; // Get the seconds
return $timestamp + $hours;

同样,正如Ghigo所指出的,如果偏移量包含分钟,这是不正确的,但它适用于我的情况。

这就是我用来从Xero API解析时间戳的内容。它说明:

  • 负时间戳,纪元之前的日期
  • 小于10位的时间戳(但在历元时间零点上,甚至不确定该格式是什么样子)
  • 几分之一秒
  • 可选时区偏移量,正负两种
代码:


您可以使用此包解析JSON日期:



这是UNIX时间戳。在输出JSON之前,请将其从UNIX转换为正常的datetime字符串。带有时区偏移的UNIX时间戳,这是我看到的一个选项,还有
/Date(13650046523030500)/
,然后这就是乐趣的开始:)请添加更多信息,这是哪种API。这个时间戳的奇怪之处在于它是以毫秒为单位的。如果你除以1000,你会看到一个更合理的数字。这就是一开始让我感到困惑的地方。
(整数)$matches[1]fail@Baba:O??哪个PHP版本?32位系统。。。(int)$matches[1];总是会返回
PHP\u INT\u MAX
我有一个64位系统。不知道(int)和(integer)的行为differently@Jimbo它永远不会变老:P@hjpotter92输出提前5小时。。可能是由于时区的原因。@KalpeshMehta,正如我在回复中提到的:您也可以使用时区来设置与您自己的日期相关的日期。@hjpotter92-如果日期中的时区设置为您自己的,那就好了。如果他得到一个偏移量为-0800的时间,而他在东部标准时间,会发生什么?@StevenMoseley我的英语很差,但PHP文档说是…@KalpeshMehta请注意,
0500
不是时区,不要让任何人把你搞糊涂了我添加了
$dt->sub(新的日期间隔('PT5H')
紧接着
$dt=Datetime::createFromFormat..
从日期中减去5小时,它就工作了。似乎不支持负数日期(1970年之前),重要的是要注意,这很接近,但还不够接近。它将不匹配负时间戳,即1970年纪元之前的时间。它也不适用于少于10位的时间戳。另外,
DateTime::createFromFormat()
现在在解码unix时区时将忽略传递给它的任何时区,因此必须将时区作为单独的步骤添加。这是正确的答案。我的答案是从偏移量中获取时区,但没有正确地考虑夏令时。小心:当小时也包含分钟时,这将导致不正确的转换,如0930。必须将小时和分钟分开,并将
string(19) "2013-04-03 17:57:32"
string(19) "2013-04-03 12:57:32"
$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
$date_string = '/Date(-594262800300+0100)/';
preg_match('/([+-]?\d+)([+-]\d{4})?/', $date_string, $matches);
$timestamp = $matches[1] / 1000;
$hours = $matches[2] * 36; // Get the seconds
return $timestamp + $hours;
if (preg_match('#^(/Date\()([-]?[0-9]+)([0-9]{3})([+-][0-9]{4})?(\)/)$#', $data, $matches)) {
    // Handle Xero API DateTime formats. Examples:
    // "/Date(1436961673000)/" - unix timestamp with milliseconds
    // "/Date(1436961673000+0100)/" - with an additional timezone correction
    // "/Date(-1436961673000-0530)/" - before the epoch, 1924 here
    //
    // RE matches for "/Date(1436961673090+0100)/":
    // [1] = (/Date\()          "/Date("
    // [2] = ([-]?[0-9]+)       "1436961673"    epoch seconds
    // [3] = ([0-9]{3})         "090"           milliseconds
    // [4] = ([+-][0-9]{4})?    "+0100" or ""   optional timezone
    // [5] = (\)/)              ")"

    $result = \DateTime::createFromFormat('U u', $matches[2] . ' ' . $matches[3] . '000')
        ->setTimezone(new \DateTimeZone($matches[4] ?: '+0000'));
}
use \Webapix\DotNetJsonDate\Date;

$dateTime = Date::toDateTime('/Date(1365004652303-0500)/'); 
// return with \DateTime object, you can format it: $dateTime->format('Y-m-d H:i:s')