基于Unix时间戳实现游戏登录时的时间差计算与提示功能
游戏时间差计算实现方案
核心逻辑
- 时间戳转换:将服务器返回的Unix时间戳字符串(如
"1686311723")转换为可计算的时间戳数字,同时获取当前时间的毫秒级时间戳。 - 差值计算与场景判断:
- 当前时间早于开始时间:计算开始时间与当前时间的差值,生成「距离开始」的提示
- 当前时间介于开始与结束时间之间:计算结束时间与当前时间的差值,生成「距离结束」的提示
- 当前时间晚于结束时间:返回「游戏已结束」提示
- 格式标准化:将秒级差值转换为补零的
hh:mm:ss格式,确保显示统一(如1小时10分23秒显示为01h:10m:23s)
代码实现(JavaScript)
// 模拟服务器返回的Unix时间戳字符串(对应示例中的"06/09/23 5:15:23 PM"和"06/09/23 10:20:00 PM") const serverStartTimeStr = "1686311723"; const serverEndTimeStr = "1686328800"; // 转换为毫秒级时间戳(JavaScript时间处理默认用毫秒) const startTime = parseInt(serverStartTimeStr) * 1000; const endTime = parseInt(serverEndTimeStr) * 1000; function getGameTimeTip() { const currentTime = Date.now(); let diffSeconds, prefix, suffix; if (currentTime < startTime) { diffSeconds = Math.floor((startTime - currentTime) / 1000); prefix = "游戏将在"; suffix = "后开始"; } else if (currentTime >= startTime && currentTime < endTime) { diffSeconds = Math.floor((endTime - currentTime) / 1000); prefix = "游戏将在"; suffix = "后结束"; } else { return "游戏已结束"; } // 格式化秒数为补零的hh:mm:ss格式 const hours = String(Math.floor(diffSeconds / 3600)).padStart(2, '0'); const minutes = String(Math.floor((diffSeconds % 3600) / 60)).padStart(2, '0'); const seconds = String(diffSeconds % 60).padStart(2, '0'); return `${prefix}${hours}h:${minutes}m:${seconds}s${suffix}`; } // 示例测试 // 模拟当前时间为"06/09/23 4:05:00 PM"(对应毫秒级时间戳1686307500000) Date.now = () => 1686307500000; console.log(getGameTimeTip()); // 输出:游戏将在01h:10m:23s后开始 // 模拟当前时间为"06/09/23 8:10:00 PM"(对应毫秒级时间戳1686320400000) Date.now = () => 1686320400000; console.log(getGameTimeTip()); // 输出:游戏将在02h:10m:00s后结束
关键细节说明
- 时间戳兼容:服务器返回的Unix时间戳多为秒级,需乘以1000转换为JavaScript默认的毫秒级时间戳,避免计算误差
- 格式统一:使用
padStart(2, '0')强制小时、分钟、秒显示为两位数字,避免出现1h:5m:3s这类不规范格式 - 边界覆盖:补充了当前时间晚于结束时间的分支,完善场景覆盖
内容的提问来源于stack exchange,提问作者vjtechno
相关产品推荐
相关产品推荐

