Java带时间倍率的游戏内指定整点现实时长计算求助
艾欧泽亚时间指定整点的现实倒计时计算方案
核心逻辑
艾欧泽亚时间流速是现实的 20.571428571428573倍,简单说:
- 现实1秒 ≈ 艾欧泽亚20.5714秒
- 艾欧泽亚1秒 = 现实
1 / 20.571428571428573秒
要计算距离下一个指定整点的现实时长,只需要先算出艾欧泽亚时间内的间隔,再除以倍率转换为现实时间即可。
具体实现步骤
1. 计算当前艾欧泽亚时间的核心数值
先把当前现实时间转成艾欧泽亚的总毫秒数,再推导总分钟数和当前小时数:
long currentRealMs = System.currentTimeMillis(); // 现实毫秒转艾欧泽亚毫秒 long eorzeaMs = (long) (currentRealMs * EORZEA_CONSTANT); // 艾欧泽亚累计总分钟数 long eorzeaTotalMinutes = eorzeaMs / 60000; // 60000 = 1000*60 // 当前艾欧泽亚小时数(和你现有代码逻辑一致) int currentEorzeaHour = (int) ((eorzeaMs / 3600000) % 24); // 3600000 = 1000*60*60
2. 计算艾欧泽亚时间内到目标整点的间隔
假设目标整点是targetHour(比如14、16),分两种情况计算:
int targetHour = 14; // 替换成你需要的整点 long minutesToNextTarget; if (currentEorzeaHour < targetHour) { // 当前小时还没到目标整点,算当天剩余时间 minutesToNextTarget = (targetHour - currentEorzeaHour) * 60 - (eorzeaTotalMinutes % 60); } else { // 当天目标整点已过,算第二天的同一整点 minutesToNextTarget = (24 - currentEorzeaHour + targetHour) * 60 - (eorzeaTotalMinutes % 60); } // 刚好是整点时,直接返回下一天的间隔(避免返回0) if (minutesToNextTarget == 0) { minutesToNextTarget = 24 * 60; }
3. 转换为现实时间间隔
把艾欧泽亚的分钟间隔转成现实毫秒数:
long realMsToNextTarget = (long) (minutesToNextTarget * 60000 / EORZEA_CONSTANT);
这个realMsToNextTarget就是现实中距离下一个艾欧泽亚目标整点的毫秒数,直接用来做倒计时即可。
封装成可复用方法
把上面的逻辑打包成方法,方便随时调用:
private static final double EORZEA_CONSTANT = 20.571428571428573; public static long getRealMsToNextEorzeaHour(int targetHour) { // 参数合法性校验 if (targetHour < 0 || targetHour >= 24) { throw new IllegalArgumentException("目标整点必须在0-23之间"); } long currentRealMs = System.currentTimeMillis(); long eorzeaMs = (long) (currentRealMs * EORZEA_CONSTANT); long eorzeaTotalMinutes = eorzeaMs / 60000; int currentEorzeaHour = (int) ((eorzeaMs / 3600000) % 24); long minutesToNextTarget; if (currentEorzeaHour < targetHour) { minutesToNextTarget = (targetHour - currentEorzeaHour) * 60 - (eorzeaTotalMinutes % 60); } else { minutesToNextTarget = (24 - currentEorzeaHour + targetHour) * 60 - (eorzeaTotalMinutes % 60); } if (minutesToNextTarget == 0) { minutesToNextTarget = 24 * 60; } return (long) (minutesToNextTarget * 60000 / EORZEA_CONSTANT); }
使用示例
比如获取下一个16点的现实倒计时:
long msTo16 = getRealMsToNextEorzeaHour(16); // 转换为时分秒格式 long hours = msTo16 / 3600000; long minutes = (msTo16 % 3600000) / 60000; long seconds = (msTo16 % 60000) / 1000; System.out.printf("距离下一个艾欧泽亚16点还有:%d小时%d分%d秒%n", hours, minutes, seconds);
内容的提问来源于stack exchange,提问作者fiedlerdani
相关产品推荐
相关产品推荐

