我正在调用API来获取日期/Date(1365004652303-0500)/
,我不明白这是什么格式。这个日期格式是如何调用的?我不知道该为什么类型的格式谷歌。
有人可以帮助我以Y-m-d H:i:s
格式获取此日期吗?
我调用的API是在.NET服务器上。当我使用PHP的file_get_contents
和json_decode
来调用它时,它为我创建了日期的以下日期格式:/Date(1365004652303-0500)/
答案 0 :(得分:22)
首先,您需要了解您拥有的格式
/Date(1365004652303-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 ?
interface DateFormatParser
{
/**
* @param $string
*
* @return DateTime
*/
public function parse($string);
}
abstract class PregDateParser implements DateFormatParser
{
protected $pattern, $format, $mask;
public function parse($string) {
$string = (string)$string;
$pattern = $this->pattern;
$format = $this->format;
$mask = $this->mask;
$r = preg_match($pattern, $string, $matches);
if (!$r) {
throw new UnexpectedValueException('Preg Regex Pattern failed.');
}
$buffer = vsprintf($mask, $matches);
$result = DateTime::createFromFormat($format, $buffer);
if (!$result) {
throw new UnexpectedValueException(sprintf('Failed To Create from Format "%s" for "%s".', $format, $buffer));
}
return $result;
}
}
class JsonTimestampWithOffsetParser extends PregDateParser
{
protected $pattern = '/^\/Date\((\d{10})(\d{3})([+-]\d{4})\)\/$/';
protected $format = 'U.u.O';
protected $mask = '%2$s.%3$s.%4$s';
}
$date = '/Date(1365004652303-0500)/';
$parser = new JsonTimestampWithOffsetParser;
$dt = $parser->parse($date);
echo $dt->format('r');
答案 1 :(得分:6)
试试这个:
var_dump(date('Y-m-d H:i:s', '1365004652303'/1000));
$str = '/Date(1365004652303-0500)/';
$match = preg_match('/\/Date\((\d+)([-+])(\d+)\)\//', $str, $date);
$timestamp = $date[1]/1000;
$operator = $date[2];
$hours = $date[3]*36; // Get the seconds
$datetime = new DateTime();
$datetime->setTimestamp($timestamp);
$datetime->modify($operator . $hours . ' seconds');
var_dump($datetime->format('Y-m-d H:i:s'));
返回:
string(19) "2013-04-03 17:57:32"
string(19) "2013-04-03 12:57:32"
答案 2 :(得分:4)
让我们将/Date(1365004652303-0500)/
分解为:
第一个字符串非常清楚。
下一个大数字是纪元价值
-0500表示最初存储日期的时区。它与UTC有关,因此它指的是东部标准时间。
这个时代具有毫秒精度。试试这段代码:
<?php
$str = "/Date(1365004652303-0500)/";
preg_match( "#/Date\((\d{10})\d{3}(.*?)\)/#", $str, $match );
echo date( "r", $match[1] );
?>
您还可以使用时区设置相对于您自己的日期。 http://codepad.viper-7.com/RrSkMy
答案 3 :(得分:2)
这个时间戳以毫秒为单位,这就是它如此之大的原因。
您可以使用PHP date()调用来格式化此时间戳。首先除以1,000。在标准的美国格式中,它将是
$ mydate = date('m d Y',$ timestamp);
(其中$ timestamp为1365004652303)
要以您请求的格式(Y-m-d H:i:s)格式化它,您可以使用'Y-m-d H:i:s'作为格式字符串(第一个参数)。从“ - ”开始删除文本。
$stamps = preg_split("/-/", $time);
$stamps[0] = $stamps[0]/1000;
$mydate = date('Y-m-d H:i:s', $stamps[0]);
这将产生2013-04-03 11:57:32
其他人建议0500是抵消;如果是这样,你想要相应地调整$ stamps [0]。
答案 4 :(得分:1)
如果您的日期类似/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
答案 5 :(得分: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');
答案 6 :(得分:0)
我的体验略有不同,这使我对Baba的优秀答案做了一些微小的改动。
使用Newtonsoft的JSON库对.NET中的消息进行编码,然后将其发送到我们的网站(PHP部分),我在时区偏移之前得到一个空格,没有+/-字符。
我也看到过前纪元日期的负数,这意味着我需要在毫秒值之前提供一个 - 符号。
我将正则表达式改为此,它对我来说非常有效:
^/Date(([-]?\d{10})(\d{3})\s?([+-]?\d{4}))/$
两个不同之处是
在10位毫秒值之前 [-]?
,和
在时区偏移之前\s?
。
我会把这作为对巴巴答案的评论,但我缺乏声誉并不允许我这样做。我希望这对我来说是合适的,因为我觉得它可能有用。
答案 7 :(得分:0)
Baba's answer非常有帮助,但没有涵盖我需要的3种情况:
这是我用来获取时间戳的方法:
$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指出的那样,如果偏移量包含分钟数,这是不正确的,但它适用于我的情况。
答案 8 :(得分:0)
这就是我用来从Xero API解析时间戳的内容。它占:
代码:
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'));
}
答案 9 :(得分:0)
您可以使用此包来解析JSON日期:
https://github.com/webapix/dot-net-json-date-formatter
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')