前言:
在程序员中, 经常会涉及到过零点重置玩家数据, 我目前做游戏开发, 刚好遇到个防沉迷的功能模块, 涉及到累计时间的判断. 如果重置时间是零点就可以直接吊底层库, 而目前游戏设定是凌晨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);
}
这是昨天记录的笔记, 感谢您的查阅
若是有问题欢迎指正
谢谢
:)