2011-01-25 57 views

回答

1

AS3超时(例如setTimout)像JavaScript一样。 use of setTimeout in AS is talked about here。给定两个日期(现在和何时应该触发警报),以毫秒为单位计算差值并将其用作超时参数。

或者(并且效率低下,但不足以睁大眼睛),setTimeout可以每分钟运行一次,如果它是“神奇的时间”(或者在先前的时间间隔之前过去!记住需要2倍的频率观察所有的变化,并且可能发生时钟偏移...)然后发出警报。

请注意,有一些限制,如AS主机在超时或时钟周期期间关闭。可能没有DST担心这里,但夏时制问题来处理日期/时间。

快乐编码。

编辑: AS还有Timer class它是setTimeout/setInterval/clearTimeout/clearInterval功能的包装。无论如何,如果“使用对象”是首选。

2

我想说你创建一个循环来检查Date对象的当前时间。

package { 
import flash.display.Sprite; 
import flash.utils.clearInterval; 
import flash.utils.setInterval; 
public class TimeCheck extends Sprite 
{ 
    private var interval:int; 
    public function TimeCheck() 
    { 
     interval = setInterval(checkTime, 1000);//check performed every second 
     checkTime(); 
    } 
    private function checkTime():void 
    { 
     var date:Date = new Date(); 
     if (date.hours == 23 && date.minutes == 55)//actual time check 
     { 
      clearInterval(interval);//kills the loop 
      //... do something ... 
     } 
    } 
} 
} 

请注意,这是执行客户端,因此将使用客户端时间。可能有办法将它同步到服务器时间。

希望它有助于

+1

+1良好的代码文章。但是,*检查间隔必须至少是频率的两倍或者一分钟可能会丢失!*(或者至少这是我从基础物理学中记得的,但我无法在网上找到任何信息......)无论如何,确定在setTimeout中建立松弛:假设时间是'23:54.99',下一个超时*需要稍微超过1000ms才能运行*,因此接下来会看到值'23:56.01`并跳过23.55。 ?`。虽然这是一个边缘案例,但可能会发生。增加观察频率,尝试纠正观察者时间,和/或观察23:55是否在“当时”和“现在”之间。 – 2011-01-28 03:34:39

0

我没有测试过,但这样的事情应该工作...

var eventDate:Date = new Date(); 
eventDate.setHours(23, 55); 
var now:Date = new Date(); 

var delay:Number = eventDate.time - now.time; 

if(delay > 0)//if we haven't yet passed 23:55 
{ 
    var timer:Timer = new Timer(delay , 1); 
    timer.addEventListener(TimerEvent.TIMER , yourMethod); 
    timer.start(); 
} 
0

我相信上述解决方案的工作;然而,它们在性能方面似乎非常昂贵。我有一个(相对)优雅和直截了当的双线程。该解决方案使用匿名函数,即客户端时间,并假定给出了一个参数startDate:Date。我没有测试过,所以可能会出现一个简单的逻辑错误,但这个想法应该给一些想法。

var timer:Timer = (new Timer(startDate.time - (new Date()).time, 1)).addEventListener(TimerEvent.TIMER, function():void { 
    // This area is called after the allocated time. 
}); 
timer.start(); 
相关问题