Actionscript 3 计算小时与小时之间的剩余分钟actionscript 3

Actionscript 3 计算小时与小时之间的剩余分钟actionscript 3,actionscript-3,flash,date,time,actionscript,Actionscript 3,Flash,Date,Time,Actionscript,我使用AS3提取XML数据,其中一个字段是XML中的时间字段,显示一小时。我获取日期,然后AS3根据XML中设置的时间加载适当的节点。这一切都很完美-我有两个变量,一个是系统时间(设置为UTC时间),另一个是提前一小时 这两个变量是currentHour和newHour-它正在做我想做的一切,但是现在我想在这两个小时之间创建一个倒计时,并以分钟为单位显示剩余时间 下面是完整的代码。 这些看起来很直截了当,但我的日子不好过。我试过这个: var data:Array = [currentHour

我使用AS3提取XML数据,其中一个字段是XML中的时间字段,显示一小时。我获取日期,然后AS3根据XML中设置的时间加载适当的节点。这一切都很完美-我有两个变量,一个是系统时间(设置为UTC时间),另一个是提前一小时

这两个变量是currentHour和newHour-它正在做我想做的一切,但是现在我想在这两个小时之间创建一个倒计时,并以分钟为单位显示剩余时间

下面是完整的代码。

这些看起来很直截了当,但我的日子不好过。我试过这个:

var data:Array = [currentHour, newHour];

var aDate:String = data[0].split(" ")[0];

var dateElements:Array = aDate.split("-");
var date1:Date = new Date();
date1.setMinutes(int(data[0].split(" ")[1].split(":")[0]));
dateElements = data[1].split(" ")[0].split("-");
var date2:Date = new Date();
date2.setMinutes(int(data[1].split(" ")[1]));
var elapse:Number = date2.getTime() - date1.getTime();
trace("minutes: " + date2.getMinutes());
但这是不对的,所以我尝试了这个:

if(currentHour < newHour)
{
var dayDiff:Number = newHour-currentHour;
// make sure it’s in the future
if (dayDiff > 0)
{
var seconds:Number = dayDiff / 1000;
var minutes:Number = seconds / 60;
}
trace(minutes, seconds);
}
if(当前小时<新小时)
{
var dayDiff:Number=newHour currentHour;
//确保它是在未来
如果(dayDiff>0)
{
var秒数:数字=dayDiff/1000;
var分钟数:数字=秒/60;
}
跟踪(分钟、秒);
}

如果有人能帮我摆脱困境那就太棒了。谢谢大家!

您需要添加一个enterFrame事件处理器

private var frameCount:int = 0;

private var diff:int = 3600;//the seconds between the two hours, you could set it here

this.addEventListener(Event.ENTER_FRAME, handler);

private function handler(event:Event):void {
     frameCount++;

     if (frameCount >= stage.frameRate) {

          frameCount = 0;

          diff--;

          if (diff < 0) {
              this.removeEventListener(Event.ENTER_FRAME, handler);
          }
     }

     var minutes:int = diff/60;
}
private-var-frameCount:int=0;
私有变量差异:int=3600//两小时之间的秒数,你可以在这里设置
this.addEventListener(Event.ENTER_FRAME,handler);
私有函数处理程序(事件:event):void{
frameCount++;
如果(帧数>=阶段帧率){
帧数=0;
差异--;
如果(差异<0){
this.removeEventListener(Event.ENTER_FRAME,handler);
}
}
变量分钟数:int=diff/60;
}

我建议您使用定时器。首先声明一个变量seconds(介于currentHour和newHour之间):

然后给它赋值

seconds = (newHour - currentHour) * 3600;
然后声明一个计时器,它将每秒滴答一次(第二个参数告诉它将滴答多少次):

然后创建将进行所有必要更新的timerHandler:

function func(e:TimerEvent):void {
    --seconds;
    //if you have some textfield that shows minutes left, update it's text here
    //timeTextfieldText.text = int(seconds / 60) + " minutes left";
    trace(int(seconds / 60));
}

关于如何显示数据有点不清楚,但这至少是如何使其工作的。您需要将“currentHour&newHour”替换为实际小时数。然后用适当的代码处理onTimer内部的案件

这段代码与其他解决方案的区别在于,它在启动时会有一个时间戳,然后每当计时器事件发生时,它都会根据该时间戳检查当前时间。也就是说,不管闪光计时器是否关闭了几毫秒,等等

import flash.events.TimerEvent;
import flash.globalization.NumberFormatter;
import flash.utils.getTimer;
import flash.utils.Timer;

var timer:Timer = new Timer(250);

var currentHour:Number = 14;
var newHour:Number = 15;
var totalSeconds:Number = 0;
var timestampStart:Number = 0;
if(currentHour < newHour) {
    totalSeconds = (newHour - currentHour) * 3600;
    if (totalSeconds > 0) {
        timestampStart = getTimer();
        timer.addEventListener(TimerEvent.TIMER, onTimer);
        timer.start();
    }
}

function onTimer(e:flash.events.TimerEvent):void {
    var secondsRunning:Number = (getTimer() - timestampStart) / 1000;
    var secondsLeft:Number = totalSeconds - secondsRunning;
    if (secondsLeft > 0) {
        var minutes:Number = Math.floor(secondsLeft/60);
        var seconds:Number = Math.floor(secondsLeft%60);
        trace("minutes left: " + minutes, ", seconds left: " + seconds);
    } else {
        //time limit reached
        timer.removeEventListener(TimerEvent.TIMER, onTimer);
        timer.stop();
        trace("Time limit reached!");
    }
}
导入flash.events.TimerEvent;
导入flash.globalization.NumberFormatter;
导入flash.utils.getTimer;
导入flash.utils.Timer;
var定时器:定时器=新定时器(250);
var currentHour:Number=14;
变量newHour:Number=15;
var totalSeconds:数字=0;
var timestampStart:Number=0;
如果(当前小时<新小时){
总秒数=(新小时-当前小时)*3600;
如果(总秒数>0){
timestampStart=getTimer();
timer.addEventListener(TimerEvent.timer,onTimer);
timer.start();
}
}
函数onTimer(e:flash.events.TimerEvent):void{
var secondsRunning:Number=(getTimer()-timestampStart)/1000;
var secondsLeft:Number=totalSeconds-secondsRunning;
如果(secondsLeft>0){
变量分钟数:数字=数学楼层(秒英尺/60);
变量秒数:数字=数学楼层(秒数%60);
跟踪(“剩余分钟:“+minutes”,剩余秒:“+seconds”);
}否则{
//达到时限
timer.removeEventListener(TimerEvent.timer,onTimer);
timer.stop();
跟踪(“达到时间限制!”);
}
}

创建了一个新的答案,其中不包含前一个答案中的垃圾邮件,我试图找出实际问题以及程序的期望值。总而言之:

用户希望,给定一个特定的日期/时间,找出距离下一个完整的小时还有多长时间,因此,例如给定时间下午4:47,用户希望找出距离下午5:00还有多少分和秒

import flash.display.MovieClip;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.globalization.NumberFormatter;
import flash.utils.getTimer;
import flash.utils.Timer;

var timer:Timer = new Timer(250);
var my_date:Date = new Date();
var targetDate:Date = new Date();

//calculate how many total milliseconds left until next whole hour since that is how as3 is using Date-objects
var timeUntilWholeHourMS:Number = (60 - my_date.getMinutes()) * 60 * 1000;
targetDate.setTime(my_date.getTime() + timeUntilWholeHourMS);
//clear the "second and milliseconds" part of the new time since we want the whole hours
targetDate.setSeconds(0, 0);

var secondsLeft:Number = (targetDate.time - new Date().time) / 1000;
//make sure it is in the future
if (secondsLeft > 0) {
    timer.addEventListener(TimerEvent.TIMER, onTimer);
    timer.start();
}

function onTimer(e:flash.events.TimerEvent):void {
    secondsLeft = (targetDate.time - new Date().time)/1000;

    if (secondsLeft > 0) {
        var minutes:Number = Math.floor(secondsLeft/60);
        var seconds:Number = Math.floor(secondsLeft%60);
        trace("minutes left: " + minutes, ", seconds left: " + seconds);
    } else {
        //time limit reached
        timer.removeEventListener(TimerEvent.TIMER, onTimer);
        timer.stop();
        trace("Time limit reached!");
    }
}

某种输出将是好的,因此我们知道程序的当前状态。在场景1和场景2中,您跟踪到了什么?场景1生成“TypeError:Error#1006:value不是一个函数。在拍卖时测试7_fla::MainTimeline/frame1()”。场景二生成:0.01666666作为跟踪结果。无论时间如何,始终是这样。此解决方案不起作用,并且会偏离实际时间,因为您假设“1000毫秒+到达下一帧所需的任何时间”时计时器正好为1000毫秒。您能否解释此解决方案不起作用的原因?(它可能有一些分歧,但对我来说效果很好)当时使用您的解决方案创建了一个小应用程序,并一直运行到现在。32689秒后,您的解决方案将报告它已处于活动状态32549秒。原因是每次flash更新其逻辑时,它都会检查“计时器上的时间>=目标时间”,然后更新并重置计时器。这意味着您将以较小的幅度延迟每1000毫秒。(我的经验研究似乎建议使用1004ms)基本上,你要做的是在你从
var timestamp:Number=getTimer()
开始倒计时的初始时间保存一个时间戳,然后在你需要时间时检查它
var secondsLeft:Number=(getTimer()-timestamp)/1000
Daniel,你认为你可以进一步解释你的解决方案吗?这很酷,但无论如何都可以在flash文件中执行,而不依赖于类文件?我尝试了这个
var my_date:date=new date();var currentHour:Number=my_date.getUTCHours()+(my_date.getUTCMinutes()/60)+(my_date.getUTCSeconds()/1000);跟踪(当前小时);var newHour:Number=currentHour+1;跟踪(新小时);变量显示时间:数字=新小时/60;var timestamp:Number=getTimer();var secondsLeft:Number=(getTimer()-timestamp)/1000;跟踪(第二个sleft);var timeLeft:Number=displayTime-secondsLeft;跟踪(时间限制)但它已关闭..随着时间的推移,您的结果将偏离“实际时间”
import flash.events.TimerEvent;
import flash.globalization.NumberFormatter;
import flash.utils.getTimer;
import flash.utils.Timer;

var timer:Timer = new Timer(250);

var currentHour:Number = 14;
var newHour:Number = 15;
var totalSeconds:Number = 0;
var timestampStart:Number = 0;
if(currentHour < newHour) {
    totalSeconds = (newHour - currentHour) * 3600;
    if (totalSeconds > 0) {
        timestampStart = getTimer();
        timer.addEventListener(TimerEvent.TIMER, onTimer);
        timer.start();
    }
}

function onTimer(e:flash.events.TimerEvent):void {
    var secondsRunning:Number = (getTimer() - timestampStart) / 1000;
    var secondsLeft:Number = totalSeconds - secondsRunning;
    if (secondsLeft > 0) {
        var minutes:Number = Math.floor(secondsLeft/60);
        var seconds:Number = Math.floor(secondsLeft%60);
        trace("minutes left: " + minutes, ", seconds left: " + seconds);
    } else {
        //time limit reached
        timer.removeEventListener(TimerEvent.TIMER, onTimer);
        timer.stop();
        trace("Time limit reached!");
    }
}
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.globalization.NumberFormatter;
import flash.utils.getTimer;
import flash.utils.Timer;

var timer:Timer = new Timer(250);
var my_date:Date = new Date();
var targetDate:Date = new Date();

//calculate how many total milliseconds left until next whole hour since that is how as3 is using Date-objects
var timeUntilWholeHourMS:Number = (60 - my_date.getMinutes()) * 60 * 1000;
targetDate.setTime(my_date.getTime() + timeUntilWholeHourMS);
//clear the "second and milliseconds" part of the new time since we want the whole hours
targetDate.setSeconds(0, 0);

var secondsLeft:Number = (targetDate.time - new Date().time) / 1000;
//make sure it is in the future
if (secondsLeft > 0) {
    timer.addEventListener(TimerEvent.TIMER, onTimer);
    timer.start();
}

function onTimer(e:flash.events.TimerEvent):void {
    secondsLeft = (targetDate.time - new Date().time)/1000;

    if (secondsLeft > 0) {
        var minutes:Number = Math.floor(secondsLeft/60);
        var seconds:Number = Math.floor(secondsLeft%60);
        trace("minutes left: " + minutes, ", seconds left: " + seconds);
    } else {
        //time limit reached
        timer.removeEventListener(TimerEvent.TIMER, onTimer);
        timer.stop();
        trace("Time limit reached!");
    }
}