java-游戏中的非零点做重置的场景下的工具函数(自定义重置时间点, 获取下次重置时间)

前言:

在程序员中, 经常会涉及到过零点重置玩家数据, 我目前做游戏开发, 刚好遇到个防沉迷的功能模块, 涉及到累计时间的判断. 如果重置时间是零点就可以直接吊底层库, 而目前游戏设定是凌晨4点重置玩家数据, 所以就会涉及到判断是否是同一天, 获取下次重置的问题.

虽说都是小的简单问题, 估计大部分写一写就出来了, 所以我这边文章也还是笔记, 就当是写过的工具代码记一下

自定义重置时间, 获取几天后(下几次)的重置时间

代码如下

public static int getHour(Calendar calendar) {
    return calendar.get(Calendar.HOUR_OF_DAY);
}

public static long getFutureResetMills(long mills, int resetHour){
    return getFutureResetMills(mills, resetHour, 1);
}

/**
 * 自定义重置时间, 获取几天后的重置时间
 * 示例
 * day: 1 : curMills: 1605081716747(2020-11-11 16:01:56), mills: 1605124800000(2020-11-12 04:00:00)
 * day: 1 : curMills: 1605034209000(2020-11-11 02:50:09), mills: 1605038400000(2020-11-11 04:00:00)
 * day: 1 : curMills: 1605024000000(2020-11-11 00:00:00), mills: 1605038400000(2020-11-11 04:00:00)
 * day: 1 : curMills: 1605023940000(2020-11-10 23:59:00), mills: 1605038400000(2020-11-11 04:00:00)
 * day: 1 : curMills: 1605038340000(2020-11-11 03:59:00), mills: 1605038400000(2020-11-11 04:00:00)
 *
 * @param mills     当前时间
 * @param resetHour 设定的重置的小时(24h), 默认4点
 * @param day       天数, 次数, 默认就下次
 * @return long mills
 */
public static long getFutureResetMills(long mills, int resetHour, int day) {
    Calendar calendar = Calendar.getInstance();
    Date date = new Date();
    if (mills > 0) {
        date.setTime(mills);
    }
    calendar.setTime(date);
    int curHour = getHour(calendar);
    if (curHour >= resetHour) {
        calendar.add(Calendar.DAY_OF_YEAR, day);
    }
    calendar.set(Calendar.HOUR_OF_DAY, resetHour);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    return calendar.getTimeInMillis();
} 

获取下次重置的时间戳

其实就是上面的

public static long getFutureResetMills(long mills, int resetHour){
    return getFutureResetMills(mills, resetHour, 1);
} 

当然也可以套个别的名字

/**
 * 自定义重置时间,来获取下一次的重置时间戳
 * 

* 例如 * curMills: 1605079957880(2020-11-11 15:32:37), mills: 1605124800000(2020-11-12 04:00:00) * curMills: 1605034209000(2020-11-11 02:50:09), mills: 1605038400000(2020-11-11 04:00:00) * curMills: 1605024000000(2020-11-11 00:00:00), mills: 1605038400000(2020-11-11 04:00:00) * curMills: 1605023940000(2020-11-10 23:59:00), mills: 1605038400000(2020-11-11 04:00:00) * curMills: 1605038340000(2020-11-11 03:59:00), mills: 1605038400000(2020-11-11 04:00:00) * * @param mills 当前时间 * @param resetHour 设定的重置的小时(24h), 默认4点 * @return long mills */ public static long getNextResetMills(long mills, int resetHour) { return getFutureResetMills(mills, resetHour); }

自定义重置时间, 判断是否是同一天

简单的做法, 直接获取这两个时间戳的下次重置时间, 判断是否相同就可以了

/**
 * 自定义重置时间, 判断是否是同一天
 * 示例
 * resetHour: 4:
 * aMills: 1605038340000(2020-11-11 03:59:00)
 * bMills: 1605038400000(2020-11-11 04:00:00) - same day: false
 * 

* resetHour: 4: * aMills: 1605024000000(2020-11-11 00:00:00) * bMills: 1605020400000(2020-11-10 23:00:00) - same day: true * * @param aMills long * @param bMills long * @param resetHour 重置时间(24h) * @return boolean true: 是同一天 */ public static boolean isSameDay(long aMills, long bMills, int resetHour) { return getNextResetMills(aMills, resetHour) == getNextResetMills(bMills, resetHour); }

这是昨天记录的笔记, 感谢您的查阅

若是有问题欢迎指正

谢谢

:)

首发链接

你可能感兴趣的:(java,游戏开发,时间戳,时间)