Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用API时Twitter时间戳不正确_Php_Twitter - Fatal编程技术网

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

Php 使用API时Twitter时间戳不正确,php,twitter,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="' .da

我正在使用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>"';

因此,使用页面顶部声明的偏移量,我需要更新时间,使其成为本地时间,而不是服务器时间。不太确定如何最好地实现这一点。

似乎API正在向您发送一个通用时间戳。您的工作是按照您所在时区的正确时间格式打印。如果使用PHP5.1或更高版本,则可以使用date\u default\u timezone\u set()来设置用于date()函数的时区。如果你想在你的时区也解析原始数据,你也必须解析原始数据

“问题”1:推文总是以UTC/GMT时间戳发送给您

“问题”2:正如手册明确指出的,它总是使用默认时区来解析日期

因此,您需要做的很简单,在使用
strotime
功能之前,您需要将时区更改为UTC。如果您更改了服务器的所有时区,则其他日期计算将出错。您可以使用以下函数获取正确的日期/时间

这将始终在同一时区显示时间,即使用户从不同时区查看站点。如果需要每个用户的方法,请查看
PHP
代码下面的内容


看看它在起作用。请记住,codepad已经使用了
UTC
,因此在本例中,它也可以仅使用
strotime

Javascript解决方案:


如果您想开始使用javascript来处理每个用户的时区,您还可以尝试使用类似的库,它具有一些处理日期/时间的良好功能。还有一些关于javascript中处理时区的其他答案。

另一个简单的技巧是使用第二个参数创建本地日期对象,即时区对象

$user_status_created_at = $status['created_at'];
$local_date = date_timezone_set(date_create($user_status_created_at),timezone_open('Asia/Jakarta'));

您确实需要将时区设置为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');
}

但这将取决于当前用户查看显示此提要的网站的位置是否正确?如果您的网站正被来自多个时区的用户访问,并且您希望确保每个用户都能正确显示,那么您需要使用以下Javascript解决此问题:。您需要将解析后的通用时间戳存储在JS变量中,确定用户的时区,相应地调整时间,然后将时间分配到HTML节点的每个属性中。您还可以尝试使用javascript告诉服务器用户的时区,然后将其存储在会话中并在服务器上进行解析。我在W3C文档中看到,您可以将时间作为通用时间保留在datetime属性中,但是你需要自己转换标题。你能举个例子说明我如何使用这个偏移量来动态更改推文的日期吗?我将用目前为止我头脑中的想法更新我的问题。
<?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))
?>
$user_status_created_at = $status['created_at'];
$local_date = date_timezone_set(date_create($user_status_created_at),timezone_open('Asia/Jakarta'));
<?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');
}