-1

我正在使用时间戳来确定两个人是否在同一时间段内在线,这是我的 UTC 时间戳仅供参考:

date_default_timezone_set('UTC');
$utc12am = 1380585600;
$utc1am = 1380589200;
$utc2am = 1380592800;
$utc3am = 1380596400;
$utc4am = 1380600000;
$utc5am = 1380603600;
$utc6am = 1380607200;
$utc7am = 1380610800;
$utc8am = 1380614400;
$utc9am = 1380618000;
$utc10am = 1380621600;
$utc11am = 1380625200;
$utc12pm = 1380628800;
$utc1pm = 1380632400;
$utc2pm = 1380636000;
$utc3pm = 1380639600;
$utc4pm = 1380643200;
$utc5pm = 1380646800;
$utc6pm = 1380650400;
$utc7pm = 1380654000;
$utc8pm = 1380657600;
$utc9pm = 1380661200;
$utc10pm = 1380664800;
$utc11pm = 1380668400;

我遇到的问题是,如果有人说他们在晚上 10 点到凌晨 12 点之间在线,这就像说在 1380668400 和 1380585600 之间它会倒退,这会抛出整个代码。我将如何编写一个仅定义小时而不是日期的时间戳,或者我将如何解决这个问题?我的大脑着火了。

更新

经过很多头痛之后,答案比它需要的要简单,所有日期都是静态的,所以动态抓取它们不是我打算做的,我只使用日期函数,所以我不必写出新的 UTC 值每个时区。无论如何,我画了一张图,这对我很有帮助,你只需要检查 $max 是否在 $mina - $maxa 的范围内,或者 $min 是否在 $mina - $maxa 的范围内。我不敢相信这花了我这么长时间

    $blend = 'False';
    if((($maxa > $min) And ($maxa < $max)) Or (($mina > $min) And ($mina < $max))) {
        $blend = 'True';
    }
    if($min > $max) {
        if(($mina > $min) Or ($mina < $max)) {
            $blend = 'True';
        }
        if(($maxa > $min) Or ($maxa < $max)) {
            $blend = 'True';
        }
    }
    if($min === $max) $blend = 'True';
4

2 回答 2

1

时间戳存储自 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来经过的秒数。

这意味着你可以从它那里得到任何你想要的东西(天、月、小时等),如果你只计算那个时代的秒数。谢天谢地,PHP 让我们很容易做到这一点。

这是时间戳中 24 小时格式的当前“小时”。

$hour = date("G", 1380621600);

这意味着从 1380621600 到 1380621600+3599 的所有时间戳都将返回 10 (am),这应该是您正在寻找的。

如果您想知道有人在上午 10 点到 12 点之间是否在线,那么您只需检查是否date("G",<timestamp>)在 10 点到 12 点之间。

如果您想检查某人是否在 2013 年 10 月 1 日 10 和 12 之间在线,那么您可以使用前面的方法以及一些额外的参数来获得您想要的内容:

$year = date("Y", <timestamp>);  
$month = date("F", <timestamp>);  
$date = date("j", <timestamp>);

如果您喜欢冒险,也可以使用爆炸一步完成此操作。

$logged_in = date("Y F j G", <timestamp>)

如果您想查看是否有两个用户在同一时间在线,那么您只需对每个人的“在线时间”进行排序,然后对列表进行一次线性扫描(使用我们现在可以计算的时间)来找出重叠。


参考:

PHP - 日期
PHP - 爆炸

于 2013-10-01T17:34:03.543 回答
1

只需保存小时(值从 0 到 23)。例如,15 点是下午 3 点。

于 2013-10-01T17:17:00.170 回答