2015-09-12 6 views
1

, когда пользователь логины на свой счет, я хочу, чтобы вычислить, так как, сколько дней подряд этот пользователь loged вСчетные дней подряд

Для этого я хранить метку времени в $loginSince и расчета последовательных дней с этой формулой:

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

проблема заключается в том, что это считается по секундам, а это означает:

  • , если пользователь входит в 17:00 (5 вечера) и на следующий день в 15:00 (3 часа) счетчик по-прежнему 1
  • если пользователь входит в систему в 8:00 (8 утра), а на следующий день в 20:00 (8 вечера) счетчик был сброшен (если разрыв между двумя входами больше 24 часов и снова 1

Я хотел бы получить реальные consectuve дней, то есть, если пользователь входит в систему, как в следующих случаях:

  1. День 1: 00:01
  2. День 2: 23:59
  3. 3-й день: 15:00

Счетчик должен сказать 3, потому что он вошел в систему в три консективных дня. С моей текущей формулой это не будет работать, так как счетчик будет сброшен между 1 и 2 днями.

Может кто-нибудь дать совет, как с этим справиться.

+0

магазин штамп времени как фиксированный час/мин/второй в этот день. например полночь. Тогда математика будет работать. –

+0

Когда сервер пользователя регистрируется, увеличивайте счетчик. и в состоянии проверки просто проверьте, что счетчик должен быть «больше или равен» не разнице между первым и последним днем ​​(предположим, что этот день, когда пользователь в настоящее время регистрирует n сейчас). Для этого вы можете хранить «одну переменную» за первый день. Разница не в днях –

+0

@EdHeal Мое решение основано на вашей идее. В эти дни я создал две «DateTime's of Midnight» и построил их «интервал». Спасибо. Вы хотите опубликовать свой комментарий в качестве ответа, чтобы я мог принять его, чтобы показать другим, что было полезно для меня? – bish

ответ

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; 
0

Возможно использование date('z'), так как это должно дать вам день, а не время?

+0

Мне нравится идея, но поскольку она возвращает от 0 до 365' whats with 29. feb? что происходит с изменением с 31.12 по 01.01 как «365 + 1! = 0' – bish

+0

Хорошо, что я мог справиться, но как обрабатывать полосу более года? – bish

Смежные вопросы