连续计算天数

时间:2015-09-12 05:29:59

标签: php

当用户登录他的帐户时,我想计算该用户已连续多少天。

为此,我将时间戳存储在$loginSince并使用以下公式计算连续天数:

$consecutiveDays = (int)((time() - $loginSince) / DAY) + 1;

问题在于这是以秒为单位的,这意味着:

  • 如果用户在17:00(下午5点)和第二天15:00(下午3点)登录,则计数器仍为1
  • 如果用户在8:00(早上8点)和第二天20:00(晚上8点)登录,则计数器重新进行(因为两次登录之间的差距大于24h且再次为1

我希望得到真正的结果日,这意味着如果用户在以下时间登录:

  1. 第1天00:01
  2. 第2天:23:59
  3. 第3天:15:00
  4. 柜台应该说3,因为他在三个连续的日子里进来了。根据我目前的公式,这不会起作用,因为计数器将在第1天和第2天之间重置。

    任何人都可以建议如何处理这个问题。

2 个答案:

答案 0 :(得分:0)

也许使用date('z'),因为这应该只是给你一天而不是时间?

答案 1 :(得分:0)

发布我制作的解决方案。它基于 Ed Heal 的想法,总是比较固定时间。我选择了午夜。之后,我构建了interval,以便处理年份变化和条纹超过一年

$loginSince = $this->dailyLoginSince($account);

// Create midnight date of the moment the login-streak started
$loginSinceMidnight = strtotime(date('Y-m-d',$loginSince).' 00:00:00');

// We create the difference between the two dates, both at midnight
$numericDayLoginSince = new DateTime();
$numericDayLoginSince->setTimestamp($loginSinceMidnight);

$numericDayNow = new DateTime();
$timestamp = strtotime('today midnight');
$numericDayNow->setTimestamp($timestamp);

$interval = $numericDayLoginSince->diff($numericDayNow);
$loginSinceDays = $interval->format('%a'); // %a = Number of days

// +1 because it seems to be more thrilling, that we already got one day
// by just logging in for the first time.

return $loginSinceDays + 1;