PHP日期格式/日期(1365004652303-0500)/
我正在调用一个API,从中获取日期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)/分解
/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
编辑 纪元的精度为毫秒。请尝试以下代码:
<?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')