我使用Twitter API在我的网站上使用PHP显示我的最新推文。
这是我显示时间戳的部分:
echo '<time data-original="'.$tweets[$i]['created_at'].'" title="'.date('l, j F Y', strtotime($tweets[$i]['created_at'])).' at '.date('g:ia', strtotime($tweets[$i]['created_at'])).'" datetime="' .date('Y-m-d', strtotime($tweets[$i]['created_at'])). 'T' . date('H:i:s', strtotime($tweets[$i]['created_at'])). 'Z" pubdate>"';
我注意到日期不正确。例如,对于在11点15分实时发布的推文,以下代码解析了以下内容:
<time data-original="Sun May 04 22:51:43 +0000 2014" title="Sunday, 4 May 2014 at 3:51pm" datetime="2014-05-04T15:51:43Z" pubdate=""><a target="_blank" href="#">19 hours ago</a></time>
首先,数据原始是一小时(也许是由于DST,但为什么没有API处理这个?因为它通过我的时区设置知道我的位置吗?)。
第二个问题是,由于我以某种方式格式化日期,似乎是将日期切换到托管服务器的位置,因此将它们移回几个小时。
有关如何解决此问题的任何想法?
我尝试使用JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
$('time').each(function(){
var time = $(this);
var timeOriginal = time.attr('data-original');
var timeDateTime = time.attr('datetime');
var timeTitle = time.attr('title');
var timeText = time.find('a').html(); // because the text is inside an anchor
timeOriginal = '';
timeDateTime = '';
timeTitle = '';
timeText = '';
});
因此,使用在页面顶部声明的偏移量,我需要更新时间,使它们变为本地而不是服务器时间。不太确定如何最好地解决这个问题。
答案 0 :(得分:4)
您确实需要将时区考虑为UTC,但如果您使用DateTime类,则可以在不更改默认时区的情况下执行此操作
<?php
// Twitter time is UTC
$utc = new DateTimeZone('UTC');
foreach ($tweets as $i => $tweet) {
$datetime = new DateTime($tweet['created_at'], $utc);
//test to see the value
echo $datetime->format('Y-md') . 'T' . $datetime->format('H:i:s');
}
答案 1 :(得分:2)
“问题”1:始终使用UTC / GMT时间戳向您发送推文。
“问题”2:正如strtotime的手册明确指出的那样,它总是使用默认时区来解析日期。
所以你需要做的很简单,你需要在使用strtotime
函数之前将时区更改为UTC。如果您全部更改服务器的时区,则会更改其他日期计算错误。您可以使用以下函数来获取正确的日期/时间。
即使用户从不同的时区查看网站,也会始终在同一时区显示时间。如果您需要按用户使用方法,请查看
PHP
代码下方。
<?php
function tweetStrToTime($t) {
//store the current timezone
$ctz = date_default_timezone_get();
//switch to UTC
date_default_timezone_set('UTC');
//use strtotime
$time = strtotime($t);
//change back to the orignal timezone
date_default_timezone_set($ctz);
//return the result from strtotime
return $time;
}
//a copy of your value in $tweets[$i]['created_at']
$tweettime = "Sun May 04 22:51:43 +0000 2014";
//test to see the value
echo date('Y-m-d', tweetStrToTime($tweettime)). 'T' . date('H:i:s', tweetStrToTime($tweettime))
?>
codepad example看到它的实际效果。请注意,键盘已经使用UTC
,因此在这种情况下它也可以使用strtotime
Javascript解决方案:
如果你想开始使用javascript来处理每个用户的时区,你也可以尝试像momentjs这样的库,它有一些很好的功能来处理日期/时间。 this question在javascript中处理时区也有其他一些答案。
答案 2 :(得分:0)
似乎API正在向您发送通用时间戳。您的工作是以正确的时间格式打印您的时区。如果使用PHP 5.1或更高版本,则可以使用date_default_timezone_set()来设置用于date()函数的时区。如果你想在你的时区中也需要解析数据,你也必须解析它。
http://php.net/manual/en/function.date-default-timezone-set.php
答案 3 :(得分:0)
另一个简单的技巧是使用第二个参数创建本地日期对象,该参数是时区对象。
$user_status_created_at = $status['created_at'];
$local_date = date_timezone_set(date_create($user_status_created_at),timezone_open('Asia/Jakarta'));