签到代码逻辑应该是什么样的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coyote
V2EX    问与答

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

  •  
  •   Coyote 2015-07-28 09:00:53 +08:00 4788 次点击
    这是一个创建于 3784 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    日期判断是时间日期库的事情,不要自己去算每月的天数。
    Coyote
        2
    Coyote  
    OP
       2015-07-28 09:18:44 +08:00
    @gamexg 那如何判断本次和上次是不是连续的呢, 增量的还好, 比如日期是12号和13号这种, 但是30号和1号也算是连续的, 31号和1号也算是连续的, 2月的28号, 2月的29号和1号都是连续的, 这个就有点不好判断了....
    aheadlead
        3
    aheadlead  
       2015-07-28 09:19:23 +08:00   1
    @Coyote unix epoch timestamp
    Coyote
        4
    Coyote  
    OP
       2015-07-28 09:25:44 +08:00
    @aheadlead ToT 求详解~
    issac
        5
    issac  
       2015-07-28 09:36:18 +08:00   2
    $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
        6
    tuutoo  
       2015-07-28 09:38:46 +08:00   1
    还有怎样才能实现过了24点继续签到的呢? 这个应该不用管啊,只是签到的时候做下数据库里做下检查就行了,保证当天只有一次签到。过了24点 就是第二天了,数据库里没当天的记录就可以写进去。
    所以,主要的逻辑应该是加在签到那一刻进行检查。

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

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

    PS:个人理解,谨慎参考,小心入坑。。。
    wuling
        8
    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
        9
    popok  
       2015-07-28 11:24:47 +08:00
    记录一个上次签到日期,和连续天数,每次签到时检测上次签到是不是昨天,如果是,天数+1,不是天数清0
    Coyote
        10
    Coyote  
    OP
       2015-07-28 15:14:42 +08:00
    @issac 非常感谢, 我没有想到转换为时间戳去计算的方式, 领教了!

    @BigDecimal 恩恩, 思路应该是对的, 签到记录表就看需求要不要记录详细了, 需要的话就记, 不需要就不急, 应该和计算没有太大关系
    leavic
        11
    leavic  
       2015-07-28 15:16:42 +08:00
    unix系统的原生时间就只是个数字,机器根本不知道现在是几月。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2749 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 08:50 PVG 16:50 LAX 00:50 JFK 03:50
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86