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

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

这是示例字符串:

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

根据API(created_at)的0000表示它确实是UTC.现在,我正在使用strtotime和date来确认时间.附:

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

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

我得到2009年10月31日19:10:37.如果我删除0000,我将于2009年10月31日23:10:37.所以0000和没有它之间的区别是4小时.我猜是因为我当地的时区(马里兰州,美国= America / NewYYork),而且显然不同于UTC.

我不确定在尝试确定此时间戳是否在我的数据库中存储的两个时间戳的范围内时,是否应该剥离0000或使用它,这是2009-10-30 23:16:38和2009 -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还是脱掉它?精神上轻拍

解决方法:

你当然应该留下时区信息,如果你也正确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.

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

上一篇:POJ 2478 Farey Sequence(欧拉函数前n项和)


下一篇:c – Linux上的距离UTC – LocalTime