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

med*_*iev 4 php mysql timezone timestamp utc

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

这是示例字符串:

'Sat, 31 Oct 2009 23:48:37 +0000',
Run Code Online (Sandbox Code Playgroud)

+0000根据API(created_at)表示它确实UTC.现在,我正在使用strtotime并且date只是为了确认时间.附:

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

echo date('M d Y H:m:s', $timestamp);
Run Code Online (Sandbox Code Playgroud)

我得到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")'),
Run Code Online (Sandbox Code Playgroud)

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

dec*_*eze 5

如果您还正确设置了服务器时区,您当然应该保留时区信息.否则,重要的是,你所有的时间比较将是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
}
Run Code Online (Sandbox Code Playgroud)

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

接受你的选择,一直这样做.