签到代码逻辑应该是什么样的?

2015-07-28 09:00:53 +08:00
 Coyote

比如类似V2这样的签到, 如何计算连续签到的天数, 又如何知道从哪天断掉连续登陆的天数?

如果按照日期来判断, 该如何去判断呢, 尤其是2月, 31天的月份, 30天的月份这种, 月末到下个月的月初怎样判断是否连续或者不连续呢?

还有怎样才能实现过了24点继续签到的呢?

4364 次点击
所在节点    问与答
11 条回复
gamexg
2015-07-28 09:12:44 +08:00
用户表上面记录连续签到次数及最近一次签到时间即可。
如果为了保留log,在弄一个表存放签到日志,每行一个记录,记录上签到日期及用户id。

日期判断是时间日期库的事情,不要自己去算每月的天数。
Coyote
2015-07-28 09:18:44 +08:00
@gamexg 那如何判断本次和上次是不是连续的呢, 增量的还好, 比如日期是12号和13号这种, 但是30号和1号也算是连续的, 31号和1号也算是连续的, 2月的28号, 2月的29号和1号都是连续的, 这个就有点不好判断了....
aheadlead
2015-07-28 09:19:23 +08:00
@Coyote unix epoch timestamp
Coyote
2015-07-28 09:25:44 +08:00
@aheadlead ToT 求详解~
issac
2015-07-28 09:36:18 +08:00
$lastDay = '2015-07-27'; //获取最后一次签到时间,通过时间格式函数去除了时分秒

$today = date('Y-m-d'); //获取本次签到日期

$diffTimestamp = strtotime($today) - strtotime($lastDay); //把两个日期转换成时间戳

$countDays = 1; //累计签到天数

if($diffTimestamp <= 86400) { //1天的秒数,V2应该是2天,这样就是172800
$countDays += 1;
} else {
$countDays = 1;
}

关于lastDay.
如果数据库存的是'2015-07-27 15:05:48';这样的时间
可以通过date('Y-m-d', '2015-07-27 15:05:48');
得到'2015-07-27';
转换成时间戳是1437926400;
本次签到日期同理.

时间戳可以解决跨月判断的问题
也可以解决了24点就可以签到的问题
tuutoo
2015-07-28 09:38:46 +08:00
还有怎样才能实现过了24点继续签到的呢? 这个应该不用管啊,只是签到的时候做下数据库里做下检查就行了,保证当天只有一次签到。过了24点 就是第二天了,数据库里没当天的记录就可以写进去。
所以,主要的逻辑应该是加在签到那一刻进行检查。

至于v2ex的满10天连续签到逻辑,我想这样写。
找数据库里最近的第9笔签到记录的日期。和当前日期减9天比较,如果日期不一样,那说明中间肯定是不连续,还不到10天的连续签到。当数据库里的第9笔记录和当前日期-9相等,就满足连续10天的签到逻辑了。

只是提供个想法做为参考啊,不知道真实逻辑是怎么写的。
BigDecimal
2015-07-28 10:12:31 +08:00
用当前签到的时间减去最后一次签到的时间,如果小于24小时则连续,大于则不连续。然后表中用一个字段记录连续的天数,连续的话+1,不连续的话就清0。应该不用去考虑是否为2月,是否30、31天的情况吧?而v2ex应该有专门的表记录签到吧

PS:个人理解,谨慎参考,小心入坑。。。
wuling
2015-07-28 11:08:54 +08:00
@gamexg 说得对,日期操作交给日期时间库就行了,一般的语言不可能连这种库都没有。以下是php举例:
<?php
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');
?>
popok
2015-07-28 11:24:47 +08:00
记录一个上次签到日期,和连续天数,每次签到时检测上次签到是不是昨天,如果是,天数+1,不是天数清0
Coyote
2015-07-28 15:14:42 +08:00
@issac 非常感谢, 我没有想到转换为时间戳去计算的方式, 领教了!

@BigDecimal 恩恩, 思路应该是对的, 签到记录表就看需求要不要记录详细了, 需要的话就记, 不需要就不急, 应该和计算没有太大关系
leavic
2015-07-28 15:16:42 +08:00
unix系统的原生时间就只是个数字,机器根本不知道现在是几月。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/208800

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX