0

我正在尝试确定用户上次登录的时间。我目前的方法有效,但有没有更简单的方法来确定这一点,以便我可以确定最后 X 小时等?

这是我目前使用的:

$last_login_di = getdate($last_login);

$now = time();
$now_di = getdate($now);
$today = mktime(0,0,0,$now_di['mon'],$now_di['mday'], $now_di['year']);
if ($last_login > $today) {
    return 'Online Today';
}

$yesterday = $now-86400;
$yesterday_di = getdate($yesterday);
$yesterday = mktime(0,0,0,$yesterday_di['mon'],$yesterday_di['mday'], $yesterday_di['year']);
if ($last_login > $yesterday) {
    return 'Online Yesterday';
}

if (($now - $last_login < 604800) ) {
    return 'Online This Week';
}

....
4

5 回答 5

3

尝试 strtotime()(查看它接受的相关格式)或更好的DateTimeDateInterval类。

例如,$yesterday变量创建在日期时间节省附近容易出错。strtotime()通过以下方式正确处理此问题:

$yesterday = strtotime('-1 day');

虽然 $last_login 检查可以写成:

if (strtotime('-1 week') < $last_login) {
    // ...
}

如果您需要支持不同的时区,您可能会更好地使用DateTime对象。

于 2013-06-03T19:17:20.927 回答
1

查看 php.net 上的 DateTime 和相关类DateTime BookDateInterval 类可能对您特别有用。

于 2013-06-03T19:16:29.373 回答
1

你怎么得到日期?使用 MySQL?使用 UNIX_TIMESTAMP 作为日期,例如SELECT UNIX_TIMESTAMP(last_login) AS last_login_timestamp FROM ...然后你可以更好地在 PHP 中计算(使用 date_diff)

于 2013-06-03T19:16:44.790 回答
0

我认为你的代码很好。但是$yesterdayvar 是错误的。它应该是:

$yesterday = $today - 86400;

在您的代码$yesterday中意味着$a_day_ago.

上周也一样。

于 2013-06-03T19:19:28.217 回答
0

您应该大量使用 PHP 内置的日期对象。

$now = new DateTime();
$yesterday = new DateTime('yesterday');
$lastWeek = new DateTime('last week');

现在您可以使用基本的比较运算符来进行任何您想要的比较逻辑:

if ($last_login > $now) {
    ...
} else if ($last_login > $yesterday) {
    ...
} else if ($last_login > $lastWeek) {
    ...
} else {
    ...
}

如果您选择不使用这些对象,请尽量避免使用该time()功能。这使得单元测试变得不可能。测试不应该依赖于环境。

改为使用$_SERVER['REQUEST_TIME'],以便您以后可以模拟它。

于 2013-06-03T19:27:38.067 回答