4

我试图确定在 JSON Twitter 提要中给出的表示日期和时间的字符串是否在 MySQL 中的时间戳列范围内。

这是示例字符串:

'Sat, 31 Oct 2009 23:48:37 +0000',

根据API+0000 ( )表明确实如此。现在,我正在使用,只是为了确认时间。和:created_atUTCstrtotimedate

$t = 'Sat, 31 Oct 2009 23:48:37 +0000';
$timestamp = strtotime($t);

echo date('M d Y H:m:s', $timestamp);

我明白了Oct 31 2009 19:10:37。如果我删除+0000我得到Oct 31 2009 23:10:37. +0000所以拥有和没有拥有它的区别是4小时。我猜是因为我的当地时区(美国马里兰州 = America/New_York),而且显然与 UTC 不同。

我不太确定+0000在尝试确定此时间戳是否在我的数据库中存储的两个时间戳的范围内时,我是否应该剥离或使用它,它们是2009-10-30 23:16:382009-11-25 12:00:00。我现在觉得很傻而且有点困惑,当我填充这些时间戳时,YYYY-MM-DD H:M:S 来自 Javascript 日期时间选择器,一个示例格式是10/31/2009 11:40 am,我像这样使用 STR_TO_DATE:

STR_TO_DATE("10/31/2009 11:40 am", "%m/%d/%Y %l:%i %p")'),

我应该离开+0000还是剥离它?精神出击

4

2 回答 2

5

您当然应该保留时区信息,前提是您还正确设置了服务器 timezone。否则有什么意义,你所有的时间比较都将关闭 4 小时。:o)

要比较时间,您应该将其保留为 UNIX 时间戳,即strtotime.

$twitterTS    = strtotime('Sat, 31 Oct 2009 23:48:37 +0000');
$localStartTS = strtotime('Sat, 31 Oct 2009 19:00:00'); // timezone is -0400 implicitly
$localEndTS   = strtotime('Sat, 31 Oct 2009 20:00:00');

if ($localStartTS <= $twitterTS && $twitterTS <= $localEndTS) {
    // twitter timestamp is within range
}

澄清一下:在比较不同时区的时间之前,请确保它们都转换为相同的时区。在没有时区信息的情况下将伦敦时间 20:00 与纽约时间 20:00 进行比较将产生不正确的结果。strtotime将所有时间转换为您当地的时区;如果输入中存在时区信息,它将尊重它并适当地转换时间,否则它将假定时间已经本地化。如果您的数据库中的所有时间都是本地时间,那么您绝对应该确保本地化您想要与它们进行比较的所有时间戳。
另一种策略是在存储或比较它们之前始终将所有时间转换为 UTC。

任你选,坚持做下去。

于 2009-11-01T03:18:34.423 回答
0

在 PHP 中,您可以简单地使用 substring 函数将 json twitter 时间分解为其组件,如下所示

//'Sat, 31 Oct 2009 23:48:37 +0000'
$hour = substring($jsontime,18,2);
$minute = substring($jsontime,22,2);
...

$phpDatetime mktime($hour,$minute,$second,$month,$day,$year);

从那里我想你已经有了它。不要忘记调整 GMT 差异。

于 2009-11-01T03:06:48.567 回答