前言:
在程序员中, 经常会涉及到过零点重置玩家数据, 我目前做游戏开发, 刚好遇到个防沉迷的功能模块, 涉及到累计时间的判断. 如果重置时间是零点就可以直接吊底层库, 而目前游戏设定是凌晨4
点重置玩家数据, 所以就会涉及到判断是否是同一天, 获取下次重置的问题.
虽说都是小的简单问题, 估计大部分写一写就出来了, 所以我这边文章也还是笔记, 就当是写过的工具代码记一下
自定义重置时间, 获取几天后(下几次)的重置时间
代码如下
代码语言:javascript复制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();
}
获取下次重置的时间戳
其实就是上面的
代码语言:javascript复制public static long getFutureResetMills(long mills, int resetHour){
return getFutureResetMills(mills, resetHour, 1);
}
当然也可以套个别的名字
代码语言:javascript复制/**
* 自定义重置时间,来获取下一次的重置时间戳
* <p>
* 例如
* 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);
}
自定义重置时间, 判断是否是同一天
简单的做法, 直接获取这两个时间戳的下次重置时间, 判断是否相同就可以了
代码语言:javascript复制/**
* 自定义重置时间, 判断是否是同一天
* 示例
* resetHour: 4:
* aMills: 1605038340000(2020-11-11 03:59:00)
* bMills: 1605038400000(2020-11-11 04:00:00) - same day: false
* <p>
* 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);
}
这是昨天记录的笔记, 感谢您的查阅
若是有问题欢迎指正
谢谢
:)
以上笔记来自公众号分享, 发到这里我也是想看看能不能涨粉:)
还望各位理解
同时
也还请各位赏脸, 动动您发财的小手, 扫码关注一下下 谢谢您
代码语言:javascript复制公众号主要分享一些后端游服程序方面的知识与经验, 包含nodejs, java,python