使用API​​时Twitter时间戳不正确

时间:2014-05-05 10:47:22

标签: php twitter

我使用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 = '';

});

因此,使用在页面顶部声明的偏移量,我需要更新时间,使它们变为本地而不是服务器时间。不太确定如何最好地解决这个问题。

4 个答案:

答案 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'));