MySQL和PHP中的时间戳比较(UT​​C,+ 0000,时区)

时间:2009-11-01 02:01:30

标签: php mysql timezone timestamp utc

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

以下是示例字符串:

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

根据API+0000)的created_at表示它确实是UTC。现在,我正在使用strtotimedate来确认时间。用:

$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,如下所示:< / p>

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

我应该离开+0000还是剥离它? 精神上轻拍

2 个答案:

答案 0 :(得分:5)

如果您也正确setting the server 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。

选择,一直这样做。

答案 1 :(得分: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差异。