AS3潮汐应用:如何判断当前时间最接近指定潮汐时间?
简便判断当前时间最接近哪个潮汐时间的方法
嘿,这个需求挺实际的,咱们可以把所有时间统一转换成一天内的总分钟数来计算差值,这样对比起来就超简单!下面给你一步步拆解实现思路和代码:
核心思路
- 统一时间格式:把所有潮汐时间字符串(比如
$pmm的"13:20")和当前时间,都转换成一天内的总分钟数(13*60+20=800分钟),数值对比最直观。 - 处理跨零点情况:因为一天是1440分钟,要考虑循环时间的差值(比如当前23:50,离00:10的实际差值是20分钟,不是1420分钟),所以计算差值时要取「直接差值」和「1440-直接差值」里的较小值。
- 找出最小差值:遍历四个潮汐时间,计算每个与当前时间的最小差值,差值最小的就是最接近的那个。
具体代码实现
首先写个工具函数,把"HH:MM"格式的字符串转换成总分钟数:
function timeToMinutes(timeStr:String):int { var parts:Array = timeStr.split(":"); var hours:int = int(parts[0]); var minutes:int = int(parts[1]); return hours * 60 + minutes; }
然后把逻辑整合到你的Timer定时器函数里,实时判断最接近的潮汐时间:
var my_timer:Timer = new Timer(1000); my_timer.addEventListener(TimerEvent.TIMER, onTimer); my_timer.start(); // 存储潮汐时间的数组,同时保留名称和对应的分钟数 var tideTimes:Array = [ {name: "High 1", minutes: timeToMinutes($pmm), originalStr: $pmm}, {name: "High 2", minutes: timeToMinutes($pms), originalStr: $pms}, {name: "Low 1", minutes: timeToMinutes($bmm), originalStr: $bmm}, {name: "Low 2", minutes: timeToMinutes($bms), originalStr: $bms} ]; function onTimer(e:TimerEvent):void { var now:Date = new Date(); var currentMinutes:int = now.hours * 60 + now.minutes; // 优化实时时间显示,补零成两位数字 actual_time.text = String(now.hours).padLeft(2, "0") + ":" + String(now.minutes).padLeft(2, "0"); var closestTide:Object; var minDiff:int = 1440; // 初始设为一天的分钟数 for each(var tide:Object in tideTimes) { // 计算直接差值 var diff:int = Math.abs(currentMinutes - tide.minutes); // 取最小的差值(处理跨零点情况) var realDiff:int = Math.min(diff, 1440 - diff); if(realDiff < minDiff) { minDiff = realDiff; closestTide = tide; } } // 这里可以把结果输出到控制台或者显示在界面上 trace("当前最接近的潮汐时间:" + closestTide.name + " = " + closestTide.originalStr); // 比如显示在文本框:closest_tide_text.text = "最接近:" + closestTide.name + " " + closestTide.originalStr; }
小细节优化
- 给实时时间加了
padLeft(2, "0"),保证显示成两位数字(比如05:30而不是5:30),更符合日常阅读习惯。 - 如果你的潮汐时间字符串可能存在格式异常(比如不是HH:MM),可以在
timeToMinutes函数里加简单的格式校验,避免运行报错。
内容的提问来源于stack exchange,提问作者steph45
相关产品推荐
相关产品推荐

