精华内容
下载资源
问答
  • 2014-08-26 15:49:51

    具体思路:

    1、数据库中有一个datetime类型的last_login_time字段,即用户每次登录都会更新该字段;

    2、在登录时先取出last_login_time字段的值,并把它按照yyyy-MM-dd格式转化为字符串,然后将现在的当前时间也按照这个格式转化为字符串,比较这两个字符串是否相等就可以判断该用户今天是否第一次登录。


    //每天登录加一次积分,不会重复加积分

    //根据userID从数据库中查询最后登录时间
    String internalTimeString="select last_login_time from scpn_user where user_id="+user.getUserId();


    Map internalTime=(Map)jdbcTemplate.queryForMap(internalTimeString);


    Timestamp lastlogintime=(Timestamp)internalTime.get("last_login_time");

    //将其按照以下格式转换成字符串
    SimpleDateFormat sdfLogin = new SimpleDateFormat("yyyy-MM-dd");

    //获取系统当前时间

    Timestamp currentTime = new Timestamp(System.currentTimeMillis());

    //按照格式转换两个数据
    String lastTime = sdfLogin.format(lastlogintime);
    String nowTime = sdfLogin.format(currentTime);
           
           System.out.println("lastTime:"+lastTime);
           System.out.println("nowTime:"+nowTime);

    //判断不是同一天则加上积分,否则就不加
    if(!nowTime.equals(lastTime)){
    System.out.println("!nowTime.equals(lastTime):"+!nowTime.equals(lastTime));
    在此更新积分;
    }

    更多相关内容
  • 判断两个时间是不是同一天

    千次阅读 2015-07-12 10:35:38
    项目中很多时候需要判断两个时间是否同一天,例如用户每天都能领某种福利一次且只能领取一次,这时候当用户领取福利的时就需要判断用户上次领取的时间与当前时间是不是同一天,不是同一天的话可以领取,否则不能...

            在项目中很多时候需要判断两个时间是否是同一天,例如用户每天都能领某种福利一次且只能领取一次,这时候当用户领取福利的时就需要判断用户上次领取的时间与当前时间是不是同一天,不是同一天的话可以领取,否则不能领取。

            一般来讲我会用time(NULL)来获取用户当前领取时间,它返回的是一个整数,代表从CUT(Coordinated Universal Time 格林威治时间)时间1970年1月1日00:00:00到当前时刻的秒数,正因为它是一个整数所以这样便于存储和比较。假如两个时间分别是oldtime和newtime,他们都是用time(NULL)得到的整数时间,我们想判断他们是否是同一天只需要分别求得他们的天数,然后判断是不是相等即可,即这样:

    #define SECONDSOFONEDAY (24*60*60)
    bool IsANewDay(time_t tOldTime,  time_t tNewTime)
    {
    	int iDayOld = static_cast<int>(tOldTime/SECONDSOFONEDAY);
    	int iDayNew = static_cast<int>(tNewTime/SECONDSOFONEDAY);
    	if(iDayNew > iDayOld)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
            理论上来讲这样判断就可以了,但是仔细分析会发现这样的判断是以格林威治时间为标准的,也就是说计算的是从格林威治时间1970年1月1日00:00:00以来的第几天,但是我们实际需要计算的是对于我们当前时区来讲的第几天,所以直接用上述算法是有问题的。例如我们当前时区的时间是零点,正好是新的一天,但格林威治时间却还没到零点,这就差了一天,所以要修改算法,以当前时区来计算:

    #define SECONDSOFONEDAY (24*60*60)
    bool IsANewDay(time_t tOldTime,  time_t tNewTime)
    {
    	struct timezone tvTimeZone;
    	gettimeofday(NULL, &tvTimeZone);
    	int iTimeZoneSeconds = (-tvTimeZone.tz_minuteswest*60);
    	int iDayOld = static_cast<int>((tOldTime+iTimeZoneSeconds)/SECONDSOFONEDAY);
    	int iDayNew = static_cast<int>((tNewTime+iTimeZoneSeconds)/SECONDSOFONEDAY);
    	if(iDayNew > iDayOld)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }

            tvTimeZone.tz_minuteswest返回的是当前时区时间与格林威治时间时间差了多少分钟,所以用之前得到的秒数减去与格林威治时间相差的秒数就得到了当前时区对应的秒数,这样再除以一天的秒数就得到了正确的天数。其实有不少情况我们不想以零点来判断是否是新的一天,好比我们把凌晨5点当做分割线,凌晨5点之前是昨天,之后是新的一天,这时候再判断两个时间是不是新的一天又不一样了。其实改动也很小,只需要在原算法中加个偏移量就好了:

    #define SECONDSOFONEDAY (24*60*60)
    bool IsANewDay(time_t tOldTime,  time_t tNewTime, int iOffSetTime)
    {
    	struct timezone tvTimeZone;
    	gettimeofday(NULL, &tvTimeZone);
    	int iTimeZoneSeconds = (-tvTimeZone.tz_minuteswest*60);
    	int iDayOld = static_cast<int>((tOldTime+iTimeZoneSeconds-iOffSetTime)/SECONDSOFONEDAY);
    	int iDayNew = static_cast<int>((tNewTime+iTimeZoneSeconds-iOffSetTime)/SECONDSOFONEDAY);
    	if(iDayNew > iDayOld)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }

            例如,IsANewDay(oldtime, newtime, 5*60*60)即返回相对于凌晨五点来讲oldtime和newtime是不是新的一天,我们得到的时间本来是相对于格林威治时间1970年1月1日00:00:00的秒数(相对于零点),如果想以凌晨5点为标准的话,我们只需要计算相对于格林威治时间1970年1月1日05:00:00的秒数即可,所以把时间减去offsettime(5*60*60)就好了。



    展开全文
  • 工作中清洗日志数据的时候有时候会有这样的场景,要看用户连续登陆的情况,或者商家连续有单,用户持续下单的数据,这时候可以写个UDF,...--假定数据形式是:dt(登录日期-yyyymmdd类型) uid(用户id) select uid fro...

     

    工作中清洗日志数据的时候有时候会有这样的场景,要看用户连续登陆的情况,或者商家连续有单,用户持续下单的数据,这时候可以写个UDF,如果嫌麻烦的可以参考以下sql,可以计算出用户连续登陆的天数,diff = 1就是连续登陆2天的,大于1就是连续登陆多天以上的。

    --假定数据形式是:dt(登录日期-yyyymmdd类型)  uid(用户id)   
    select	uid
    from	(
    		    SELECT  uid
                        ,num
    				    ,MAX(dt) - MIN(dt) diff
    		    FROM    (
    				        SELECT  a.uid
    						        ,a.dt
    						        ,dt - rn as num 
    				        FROM    (
    						            SELECT  uid
    								            ,dt
    								            ,row_number () over (PARTITION BY uid ORDER BY dt) rn 
    						            FROM     table_name
    						            GROUP BY uid
    								             ,dt
    						        ) a1
    				    ) a2 
    		    GROUP BY uid
                        ,num
    		) t3
    where	diff = 1
    group by uid
    ;
    
    

    展开全文
  • 判断是否同一天 日期格式化 给日期加上指定时长 得到指定时间节点的Date 1、时间戳转Date 注:以下的方法中很多常量和方法我都没有提取出来,正式项目中还是建议大家封装时间处理类中,规范化操作 public...

    项目经常涉及到时间戳和Date类型的相互转换、时间类型处理等,我有时候一段时间不写就又忘记了,故而写篇笔记备忘下!

    本文主要包含的有:

    1. 时间戳与Date类型的相互转换
    2. 判断是否为同一天
    3. 日期格式化
    4. 给日期加上指定时长
    5. 得到指定时间节点的Date

    1、时间戳转Date

    注:以下的方法中很多常量和方法我都没有提取出来,正式项目中还是建议大家封装在时间处理类中,规范化操作

    public static void main(String[] args) {
        // 10位的秒级别的时间戳
        long time1 = 1527767665;
        String result1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time1 * 1000));
        System.out.println("10位数的时间戳(秒)--->Date:" + result1);
        Date date1 = new Date(time1*1000);   //对应的就是时间戳对应的Date
        // 13位的秒级别的时间戳
        double time2 = 1515730332000d;
        String result2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time2);
        System.out.println("13位数的时间戳(毫秒)--->Date:" + result2);
    }
    10位数的时间戳(秒)--->Date:2018-05-31 19:54:25
    13位数的时间戳(毫秒)--->Date:2018-01-12 12:12:12

    尤其要注意上面10位的秒级别的时间戳时,不能用int来定义time1变量,否则会得到错误的结果:

    public static void main(String[] args) {
        // 10位的秒级别的时间戳   
        int time1 = 1527767665;   //错误做法
        String result1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time1 * 1000));
        System.out.println("10位数的时间戳(秒)--->Date:" + result1);
    }
    10位数的时间戳(秒)--->Date:1969-12-17 23:21:47

    2、Date转时间戳

    public static void main(String[] args) {
        //获取指定时间的时间戳,除以1000说明得到的是秒级别的时间戳(10位)
        long time = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).parse("2018-06-30 20:00:00", new ParsePosition(0)).getTime() / 1000;
    
        //获取时间戳
        long now1 = System.currentTimeMillis();
        long now2 = new Date().getTime();
    
        System.out.println("获取指定时间的时间戳:" + time);
        System.out.println("当前时间戳:" +now1);
        System.out.println("当前时间戳:" +now2);
    }
    获取指定时间的时间戳:1530360000
    当前时间戳:1527769494340
    当前时间戳:1527769494340

    3、格式化Date

    public static void main(String[] args) {
        //使用common-lang包下面的DateFormatUtils类
        String format1 = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
        //使用最原始的SimpleDateFormat类
        String format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    
        System.out.println("格式化时间1:" + format1);
        System.out.println("格式化时间2:" + format2);
    }
    格式化时间1:2018-05-31 20:26:49
    格式化时间2:2018-05-31 20:26:49

    DateFormatUtils是commons.lang3.time.DateFormatUtils下的,如果你的项目中没有,maven中引入下:

    <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
       <version>3.6</version>
    </dependency>

    4、给日期加上指定时长

    比如,给现在的时间加上12个小时,这个需求也很常见,例如我做过的某个秒杀接口要返回剩余秒杀时间给前端,那么我就直接计算(比如秒杀持续时间为12小时):秒杀(倒计时)截止时间=(当前时间+12H)即可。

    public static void main(String[] args) {
        //将指定日期加上固定时间,DateUtils还有其它添加分钟、小时、月份之类的方法api
        //使用到的是commons-lang包下面的DateUitls类
        Date date = DateUtils.addDays(new Date(), 10);   //
        System.out.println("当前时间为:"+DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
        String format = DateFormatUtils.format(date, "yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间加上10天后:" + format);
    }
    当前时间为:2018-05-31 20:31:53
    当前时间加上10天后:2018-06-10 20:31:53

    DateUtils也是commons.lang3.time包下的,别忘了加maven依赖。


    5、得到指定时间节点的日期时间

    方式一:

        public static void main(String[] args) throws ParseException {
            //得到指定日期
            String date = "2018-03-03 15:20:12";
            Date parse = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date);
            System.out.println(parse);
        }

    方式二:

        /**
         * 获取当天的YYYY-MM-dd 00:00:01 时间点的毫秒级时间戳
         *
         * @return
         */
        public static Long getCurrentBeginDate() {
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.HOUR_OF_DAY, 0);//控制时
            cal.set(Calendar.MINUTE, 0);//控制分
            cal.set(Calendar.SECOND, 1);//控制秒
            return cal.getTimeInMillis();
        }

    6、判断两个时间点是否为同一天、同一年

    给定两个日期,快速判断两者是否为同一天或者同一年,比如我做过的一个接口需求是:每人每天有一次抽奖机会,那么当用户当天第二次发送请求时候,我就得判断查询参与记录,并且判断最新一次参与时间和当天是否为同一天。

        /**
         * 判断是否为同一天:使用commons-lang包下的DateUtils类
         *
         * @param day1
         * @param day2
         * @return
         */
        public boolean isSameDay(Date day1, Date day2) {
            return DateUtils.isSameDay(day1, day2);
        }
    
        /**
         * 判断是否为同一天:使用joda依赖包里的时间类,效率从一定程度上优于DateUtils.isSameDay()方法
         *
         * @param date1
         * @param date2
         * @return
         */
        public static boolean isSameDay1(Date date1,Date date2){
            if(date1==null || date2==null){
                throw new IllegalArgumentException("date must be not null");
            }
            LocalDate localDate1 = new LocalDate(new DateTime(date1.getTime()));
            LocalDate localDate2 = new LocalDate(new DateTime(date2.getTime()));
            return localDate1.equals(localDate2);
        }

    基本上涉及到时间的处理就这么多了,希望对你有参考帮助!


    books 引申阅读: 使用quartz实现高级定制化定时任务(包含管理界面)

    books 推荐阅读:elastic search搜索引擎实战demo:https://github.com/simonsfan/springboot-quartz-demo,分支:feature_es

    展开全文
  •  小x向我反应用户在我开发的系统中,其中个功能上待了很长时间,当用户跳转到其他界面上时,突然就掉线了。  他告诉我应当在用户每次向后台索取数据的时候进行用户登录状态的检验。  用户登录状态其实是...
  • 首先这里先给出一个大致的思路,就是首先我们的保存一个最后退出的时间,然后每次app进入的时候再拿到我们之前保存退出的时间,和当前的时间进行对比,如果相同则是同一天登录,反之。思路理清了,剩下的就是填空...
  • android用SP,判断是否过了一天

    千次阅读 2015-08-10 17:42:16
    思路:打开的时候缓存个时间,如果当前的时间比保存的时间大,就是第二。 PS:用sp会有个漏洞,如果客户把缓存清理了,再打开,还是会执行第二的事件,或者用户改了android的系统时间,也一样。 如果是要...
  • 判断当前view是否在屏幕可见

    千次阅读 2021-06-04 13:40:21
    项目需要动态增加小气泡引导提示用户,例如下图这种,在一个recyclerView中有个不喜欢的按钮,当用户滚动到特定类型的item时,根据条件来决定是否弹汽包提示用户(例如用户从安装APP后的连续几,都没有使用过这个...
  • 输入某年某月某日,判断一天是这一年的第几天?(Python)
  • python输入日期,判断一天是该年的第几天? import datetime def f(): year=input('请输入年份:') month=input('请输入月份:') day=input('请输入天份:') date1=datetime.date(year=int(year),month=...
  • 设计签到功能时,我们往往要判断用户当天是否已经进行签到,如果有些业务需求要求记录连续签到的次数或者天数,这时候我们就要知道用户最后次签到的时间是前天往前还是昨天往后,下面是我自己写的判断的...
  • 练习题题目:输入某年某月某日,判断一天是这一年的第几天?(Python)
  • 本文转自与博客园杯凉茶的博客.前面学习了大堆,什么JSP,Servlet、jstl、el等等等,大多是一些死的东西,只要会其语法,知道怎么用就行了,所以做了个小小的只有增删改查的小demo,为的就是熟悉这些知识。灵活...
  • 判断日期是否在7之内

    千次阅读 2017-10-28 16:51:42
    比较当前的时间和7或者n的大小关系 Date date = new Date(); //获取当前时间  Date s00 = (Date) pageData.get("addTime"); //获取需要比较的目标时间  
  • 输入某年某月某日,判断一天是这一年的第几天 题目:输入某年某月某日,判断一天是这一年的第几天。 程序分析:以3月5日为例,应该先把前两个月的天数加起来,然后再加上5天即本年的第几天。特殊情况,闰年且...
  • Java web工程判断用户是否重复登录

    万次阅读 2013-03-26 10:55:15
    前几,网上找了些朋友的资料,做了个小功能,验证用户是否重复登录。 原理就是:每用户登录前有个验证,当第登录时,会把其session信息,添加到个特定的静态变量中。当第二次登录时,验证到静态...
  • 代码 import time try: y=input('请输入年份') m=input('请输入月份') d=input('请输入日期') my_time=time.strptime('{}... print('这天是该年的第%s'%my_time.tm_yday) except: print('你输入了错误的日期格
  • while 1: year = int(input('year:\n')) #输入...= 0)): #判断是否为闰年 leap = 1 if (leap == 1) and (month > 2): sum += 1 print('这是%s年的第%s' % (year, sum)) break else: print('输入错误,请重新输入!\n')
  • 需求:判断用户活跃情况,超过30分钟不活跃直接退出登录。 本想开始记录下最后次请求的时间,用最后次请求的时间去判断用户的活跃程度。这样也有点局限。 网上搜了一下,说用鼠标移动状态来检测是否在操作...
  • 用户登录模块前言&思维导图1.判断首次启动2.用户注册3、管理员信息&...判断一个特定文件存在与否,或者判断配置文件的值是否改变; 就能够判断出来当前是不是首次启动,是的话,初始化程序,不是
  • 使用 switch 语句编程,根据输入的年份判断是否为闰年,根据输入的月份判断这月有多少。 #include&lt;stdio.h&gt; int main() { int year, month, ex; printf("请输入年份及月份(空格分隔):&...
  • 【简答题】编写程序,用户输入个列表和 2 个整数作为下标,然后输出列表中介于 2 个下标之间的元素组成的子列表。例如用户输入 [1,2,3,4,5,6] 和 2,5 ,程序输出 [3,4,5,6] 。【简答题】解释 Python 中的运算符 / 和 ...
  • 、描述 1、数据库中有个date类型的last_login_time字段,即用户每次登录都会更新该字段; ...2、在登录时使用...3、获取系统当前时间,并用DateFormat格式化,比较两个时间是否相等就可以判断用户
  • 输入年月日,判断一天是这一年的第几天?(10分) 题目内容: 给定年月日,如2019/1/8,打印输出这一天是该年的第几天。   输入格式: 共一行,为一个字符串,年月日之间以'/'隔开,如2019/1/8。   输出...
  • 今天看一下这个常见的c语言问题,输入某年某月某日,判断一天是这一年的第几天? 这个问题平时考试,蓝桥杯考试等都出现过。相信通过今天学习我们可以很明白的掌握相关知识。 今天主要用到一个选择语句switch 其...
  • 输入个年份判断是否为闰年

    万次阅读 多人点赞 2021-05-26 21:24:48
      一般年份365,闰年共有366(1-12月分别为31,29,31,30,31,30,31,31,30,31,30,31)。 二、判断闰年的条件 1、普通闰年:公历年份是4的倍数,且不是100的倍数,为普通闰年...
  • h5浏览器中无法判断用户是否安装某个app,只是如果用户安装了这个APP调起app的时候,会使页面失去焦点 微信里无法调起app,所以微信里添加个提示让用户在浏览器里打开。 $(".goBuy").click(function(){/...
  • 题目:输入某年某月某日,判断一天是这一年的第几天。方法一: year=int(input()) month=int(input()) day=int(input()) if month==1: count=day elif month==2: count = 31+day elif (month&gt;=3) and (...
  • .思路 year = int(input("请输入年:\n"))#用int()将字符型变量改为整形,以便之后的运算 month = int(input("请输入月:\n")) day = int(input("请输入日:\n")) months1 = [0,31,60,91,121,152,182,213,244,274,305...
  • #输入某年某月某日,判断一天是这一年的第几天? year = int(input(‘Year:’)) month = int(input(‘Month’)) day = int(input(‘Day’)) month = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334] now...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 251,116
精华内容 100,446
关键字:

判断用户是否在同一天登录