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

2020-11-13 18:18:42 浏览数 (1)

前言:

在程序员中, 经常会涉及到过零点重置玩家数据, 我目前做游戏开发, 刚好遇到个防沉迷的功能模块, 涉及到累计时间的判断. 如果重置时间是零点就可以直接吊底层库, 而目前游戏设定是凌晨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

程序员品程序员品

0 人点赞