company logo
advertisement for deep fried Twinkies


处理日期和时间


 
 

创建 Date 对象

Date 类是所有核心类中构造函数方法形式最为多变的类之一。您可以用以下四种方式来调用 Date 类。

第一,如果未给定参数,则 Date() 构造函数将按照您所在时区的本地时间返回包含当前日期和时间的 Date 对象。下面是一个示例:

var now:Date = new Date();
trace(now);
//返回:Fri Oct 26 17:53:45 GMT+0800 2007
第二,如果仅给定了一个数字参数,则 Date() 构造函数将其视为自 1970 年 1 月 1 日以来经过的毫
秒数,并且返回对应的 Date 对象。请注意,您传入的毫秒值将被视为自 1970 年 1 月 1 日(UTC 时
间)以来经过的毫秒数。但是,该 Date 对象会按照您所在的本地时区来显示值,除非您使用特定于 UT
C 的方法来检索和显示这些值。如果仅使用一个毫秒参数来创建新的 Date 对象,则应确保考虑到您的当
地时间和 UTC 之间的时区差异。以下语句创建一个设置为 1970 年 1 月 1 日午夜(UTC 时间)的 Dat
e 对象:
var millisecondsPerDay:int = 1000 * 60 * 60 * 24;
// 获取一个表示自起始日期 1970 年 1 月 1 日后又过了一天时间的 Date 对象
var startTime:Date = new Date(millisecondsPerDay);
trace(startTime);
//Fri Jan 2 08:00:00 GMT+0800 1970
第三,您可以将多个数值参数传递给 Date() 构造函数。该构造函数将这些参数分别视为年、月、日、小
时、分钟、秒和毫秒,并将返回一个对应的 Date 对象。假定这些输入参数采用的是本地时间而不是 UT
C。以下语句获取一个设置为 2000 年 1 月 1 日开始的午夜(本地时间)的 Date 对象:
var millenium:Date = new Date(2000, 0, 1, 0, 0, 0, 0);
trace(millenium);
//Sat Jan 1 00:00:00 GMT+0800 2000
第四,您可以将单个字符串参数传递给 Date() 构造函数。该构造函数将尝试把字符串解析为日期或时间
部分,然后返回对应的 Date 对象。如果您使用此方法,最好将 Date() 构造函数包含在 try..catch 
块中以捕获任何解析错误。Date() 构造函数接受多种不同的字符串格式,如ActionScript 3.0 语
言和组件参考》中所列。以下语句使用字符串值初始化一个新的 Date 对象:
var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM");

获取时间单位值

可以使用 Date 类的属性或方法从 Date 对象中提取各种时间单位的值。下面的每个属性为您提供了

Date 对象中的一个时间单位的值:

  • fullYear 属性
  • month 属性,以数字格式表示,分别以 0 到 11 表示一月到十二月
  • date 属性,表示月中某一天的日历数字,范围从 1 到 31
  • day 属性,以数字格式表示一周中的某一天,其中 0 表示星期日
  • hours 属性,范围从 0 到 23
  • minutes 属性
  • seconds 属性
  • milliseconds 属性

实际上,Date 类为您提供了获取这些值的多种方式。例如,您可以用四种不同方式获取 Date 对象的月

份值:

  • month 属性
  • getMonth() 方法
  • monthUTC 属性
  • getMonthUTC() 方法

例:

var millenium:Date = new Date();
trace("月份是:"+millenium.month,"日历数字是:"+millenium.date);
trace("星期是:"+millenium.day,"小时是:"+millenium.hours);
var Hours=millenium.getHours();
trace(Hours);
var Hours1=millenium.monthUTC;
trace(Hours1);

//月份是:9 日历数字是:26
//星期是:5 小时是:18
//18
//9

获得分,秒,毫秒也是同样的方法

所有四种方式实质上具有同等的效率,因此您可以任意使用一种最适合应用程序的方法。

刚才列出的属性表示总日期值的各个部分。例如,milliseconds 属性永远不会大于 999,因为当它达

到 1000 时,秒钟值就会增加 1 并且 milliseconds 属性会重置为 0。

如果要获得 Date 对象自 1970 年 1 月 1 日 (UTC) 起所经过毫秒数的值,您可以使用 getTime()

方法。通过使用与其相对应的 setTime() 方法,您可以使用自 1970 年 1 月 1 日 (UTC) 起经过的

毫秒数更改现有 Date 对象的值。

执行日期和时间运算

您可以使用 Date 类对日期和时间执行加法和减法运算。日期值在内部以毫秒的形式保存,因此您应将其它值转换成毫秒,然后再将它们与 Date 对象进行加减。

如果应用程序将执行大量的日期和时间运算,您可能会发现创建常量来保存常见时间单位值(以毫秒的形式)非常有用,如下所示:
public static const millisecondsPerMinute:int = 1000 * 60;//设一分钟
public static const millisecondsPerHour:int = 1000 * 60 * 60;//一小时
public static const millisecondsPerDay:int = 1000 * 60 * 60 * 24;//一天

现在,可以方便地使用标准时间单位来执行日期运算。下列代码使用 getTime()setTime() 方法将日期值设置为当前时间一个小时后的时间:

var oneHourFromNow:Date = new Date();
oneHourFromNow.setTime(oneHourFromNow.getTime() + millisecondsPerHour);

例如我们做个实验:

var millisecondsPerMinute:int = 1000 * 60;//设一分钟
var millisecondsPerHour:int = 1000 * 60 * 60;//一小时
var millisecondsPerDay:int = 1000 * 60 * 60 * 24;//一天
var oneHourFromNow:Date = new Date();
trace(oneHourFromNow.getTime());
var bb=oneHourFromNow.setTime(oneHourFromNow.getTime() + millisecondsPerHour);

trace( bb) ;
输出的是:

1193394817812
1193398417812       //加了1000 * 60 * 60的结果

设置日期值的另一种方式是仅使用一个毫秒参数创建新的 Date 对象。例如,下列代码将一个日期加上 30 天以计算另一个日期:

// 将发票日期设置为今天的日期
var invoiceDate:Date = new Date();

// 加上 30 天以获得到期日期
var dueDate:Date = new Date(invoiceDate.getTime() + (30 * millisecondsPerDay));
接着,将 millisecondsPerDay 常量乘以 30 以表示 30 天的时间,并将得到的结果与 invoiceDate 
值相加并将其用于设置 dueDate 值。

控制时间间隔

使用 Adobe Flash CS3 Professional 开发应用程序时,您可以访问时间轴,这会使您稳定且逐帧
地完成该应用程序。但在纯 ActionScript 项目中,您必须依靠其它计时机制。

循环与计时器之比较

在某些编程语言中,您必须使用循环语句(如 fordo..while)来设计您自己的计时方案。 
通常,循环语句会以本地计算机所允许的速度尽可能快地执行,这表明应用程序在某些计算机上的运行
速度较快而在其它计算机上则较慢。如果应用程序需要一致的计时间隔,则您需要将其与实际的日历或
时钟时间联系在一起。许多应用程序(如游戏、动画和实时控制器)需要在不同计算机上均能保持一致
的、规则的时间驱动计时机制。
ActionScript 3.0 的 Timer 类提供了一个功能强大的解决方案。使用 ActionScript 3.0 事件
模型,Timer 类在每次达到指定的时间间隔时都会调度计时器事件。

Timer 类

在 ActionScript 3.0 中处理计时函数的首选方式是使用 Timer 类 (flash.utils.Timer),可
以使用它在每次达到间隔时调度事件。
要启动计时器,请先创建 Timer 类的实例,并告诉它每隔多长时间生成一次计时器事件以及在停止前
生成多少次事件。
例如,下列代码创建一个每秒(1000毫秒)调度一个事件且持续 60 秒的 Timer 实例:
var oneMinuteTimer:Timer = new Timer(1000, 60);

Timer 对象在每次达到指定的间隔时都会调度 TimerEvent 对象。TimerEvent 对象的事件类型是

timer(由常量 TimerEvent.TIMER 定义)。TimerEvent 对象包含的属性与标准 Event 对象包含的

属性相同。

如果将 Timer 实例设置为固定的间隔数,则在达到最后一次间隔时,它还会调度 timerComplete

件(由常量 TimerEvent.TIMER_COMPLETE 定义)。

以下是一个用来展示 Timer 类实际操作的小示例应用程序:

package
{
      import flash.display.Sprite;
      import flash.events.TimerEvent;
      import flash.utils.Timer;
      public class ShortTimer extends Sprite
      {
          public function ShortTimer()
          {
              // 创建一个新的五秒的 Timer
              var minuteTimer:Timer = new Timer(1000, 5);
            
              // 为间隔和完成事件指定侦听器
              minuteTimer.addEventListener(TimerEvent.TIMER, onTick);
              minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
            
              // 启动计时器计时
              minuteTimer.start();
          }
          public function onTick(event:TimerEvent):void
          {
              // 显示到目前为止的时间计数
              // 该事件的目标是 Timer 实例本身。
              trace("用时" + event.target.currentCount);
          }
         public function onTimerComplete(event:TimerEvent):void
          {
              trace("时间已到");
          }
      }
}
新建一个FLASH文档,在第一桢按F9输入以下内容:
var myShortTimer:ShortTimer=new ShortTimer();
//用时1
//用时2
//用时3
//用时4
//用时5
//时间已到