2

昨晚我花了 8 个多小时检查所有文档,浏览各种帖子等,我几乎解决了我的问题,但仍然缺少一些我无法理解的东西。

我有一个表,它存储各种用户提交的带有unix 时间戳(例如1351867293)。我正在提取这些信息并对其进行计数,以获得“今天”、“昨天”、“本周”等提交的总数。

我使用的代码(用于“今天提交”)是:

WHERE DATE(from_unixtime(comment_date)) = CURRENT_DATE";

到目前为止一切都很好,但是有一个时间偏移并且数据没有正确显示。stackoverflow 上的用户建议使用 CONVERT_TZ 来固定偏移量。

这就是我被卡住的地方。我位于 CST 时区,我的服务器似乎位于 EST 时区。所以我使用了这段代码

 WHERE DATE(CONVERT_TZ(from_unixtime(comment_date), 'EST', 'CST')) = CURRENT_DATE";

...但它只显示“0”,尽管我今天有提交。我尝试了不同的时区,但结果它们都给了我“0”。当我用数字替换 EST 和 CST 时,例如:

 WHERE DATE(CONVERT_TZ(from_unixtime(comment_date), '+00:00', '+07:00')) = CURRENT_DATE";

...我得到一个数字输出,但数字不正确。我尝试了很多组合,包括 +08:00、-05:00,但似乎没有任何效果。

基本上我要问的是我必须将哪些值作为这两个数字,以获得正确的结果?我网站上的所有其他内容都可以在我的时区 (CST) 中正确显示,我只遇到了这个查询的问题。

如果有帮助,我的服务器的 IP 是 50.116.13.130。

4

3 回答 3

0

我终于通过使用解决了

  $timezone1 = '+12:00';
  $timezone2 = '-04:00';

 DATE(CONVERT_TZ(from_unixtime(comment_date), '$timezone1', '$timezone2')) = CURRENT_DATE"; 

为了让我8小时的时差工作。它可以工作,尽管违反所有逻辑,因为我的服务器时间是 UTC(+0 小时),输出应该是 CST(+8 小时)。所以基本上

  $timezone1 = '+00:00';
  $timezone2 = '+08:00';

应该得到我想要的结果,但它没有。我不知道为什么,但我很高兴我的第一个代码引用现在有效。

于 2012-11-03T17:28:38.453 回答
0

Unix 时间戳始终采用 UTC,因此您的服务器设置为哪个时区并不重要。

但是,您必须确保使用正确的时区转换“comment_date”的字符串表示形式:

// Use the timezone you are in (CST). If you're having user
// submissions from all over the world, use the timezone
// from where the submission came from.
$timezone = new DateTimeZone("CST"); 
$date = new DateTime("2012-01-02", $timezone);
$unixTimestamp = $date->getTimestamp();

另一个重要的事情是注意“2012-01-02”将被转换为“2012-01-02 00:00:00”。和“2012-01-02 00:00:00”!=“2012-01-02 04:03:27”。

所以当你想要今天的日期时,你应该查询一个间隔。

$today = new DateTime(); // Get current time
$today->setTimezone(new DateTimeZone("CST"));
$today->setTime(0,0,0); // Set time to midnight of today (depends on your definition of today, could also be -24h

$sql = "[..] WHERE comment_date > ".$today->getTimestamp();
于 2012-11-03T08:31:05.247 回答
0

请注意,除非您使用 JavaScript,否则您的位置并不是很重要。重要的是服务器位置。因此,如果您在 CST 中,并且您的服务器在 EST 中,那么您所有操作的时间都将在 EST 中,因为 PHP 是服务器端。

我认为最好的方法是使用 UTC 时间。您使用以下命令将服务器重置为 UTC:

date_default_timezone_set("UTC");

设置 UTC 后,您的所有时间现在都从 UTC 重置为 0 偏移,并且更容易处理。我个人使用以下函数在 PHP 和 MySQL 日期之间切换

$mysqldate = date( 'Y-m-d H:i:s', $phpdate );
$phpdate = strtotime( $mysqldate );

但同样,您可以使用时间戳。这篇文章可能会为你提供一些答案

我不确定我是否回答了你的问题,但我希望这些是对你的指导。

干杯。

于 2012-11-03T07:32:14.100 回答