V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Coyote
V2EX  ›  问与答

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

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

    比如类似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   ·   实用小工具   ·   4748 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:57 · PVG 17:57 · LAX 01:57 · JFK 04:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.