管理日历日期和时间

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

ActionScript 3.0 的所有日历日期和时间管理函数都集中在顶级 Date 类中。Date 类包含一些方法和属性,这些方法和属性能够使您按照通用协调时间 (UTC) 或特定于时区的本地时间来处理日期和时间。UTC 是一种标准时间定义,它实质上与格林尼治标准时间 (GMT) 相同。

创建 Date 对象

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

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

var now:Date = new Date();

第二,如果仅给定了一个数字参数,则 Date() 构造函数将其视为自 1970 年 1 月 1 日以来经过的毫秒数,并且返回对应的 Date 对象。请注意,您传入的毫秒值将被视为自 1970 年 1 月 1 日(UTC 时间)以来经过的毫秒数。但是,该 Date 对象会按照您所在的本地时区来显示值,除非您使用特定于 UTC 的方法来检索和显示这些值。如果仅使用一个毫秒参数来创建新的 Date 对象,则应确保考虑到您的当地时间和 UTC 之间的时区差异。以下语句创建一个设置为 1970 年 1 月 1 日午夜(UTC 时间)的 Date 对象:

var millisecondsPerDay:int = 1000 * 60 * 60 * 24; 
// gets a Date one day after the start date of 1/1/1970 
var startTime:Date = new Date(millisecondsPerDay);

第三,您可以将多个数值参数传递给 Date() 构造函数。该构造函数将这些参数分别视为年、月、日、小时、分钟、秒和毫秒,并将返回一个对应的 Date 对象。假定这些输入参数采用的是本地时间而不是 UTC。以下语句获取一个设置为 2000 年 1 月 1 日开始的午夜(本地时间)的 Date 对象:

var millenium:Date = new Date(2000, 0, 1, 0, 0, 0, 0);

第四,您可以将单个字符串参数传递给 Date() 构造函数。该构造函数将尝试把字符串分析为日期或时间部分,然后返回对应的 Date 对象。如果使用此方法,最好将 Date() 构造函数包含在 try..catch 块中,以捕获所有分析错误。 Date() 构造函数可接受多种不同的字符串格式( 用于 Adobe Flash Platform 的 ActionScript 3.0 参考 中列出了这些格式)。以下语句使用字符串值初始化一个新的 Date 对象:

var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM");

如果 Date() 构造函数无法成功分析该字符串参数,它不会引发异常。但是,所得到的 Date 对象将包含一个无效的日期值。

获取时间单位值

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

  • fullYear 属性

  • month 属性,以数字格式表示,分别以 0 到 11 表示一月到十二月

  • date 属性,表示月中某一天的日历数字,范围为 1 到 31

  • day 属性,以数字格式表示一周中的某一天,其中 0 表示星期日

  • hours 属性,范围为 0 到 23

  • minutes 属性

  • seconds 属性

  • milliseconds 属性

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

  • month 属性

  • getMonth() 方法

  • monthUTC 属性

  • getMonthUTC() 方法

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

    刚才列出的属性表示总日期值的各个部分。例如,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);

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

// sets the invoice date to today's date 
var invoiceDate:Date = new Date(); 
 
// adds 30 days to get the due date 
var dueDate:Date = new Date(invoiceDate.getTime() + (30 * millisecondsPerDay));

接着,将 millisecondsPerDay 常量乘以 30 以表示 30 天的时间,将结果与 invoiceDate 值相加,用于设置 dueDate 值。

在时区之间进行转换

在需要将日期从一种时区转换成另一种时区时,使用日期和时间运算十分方便。也可以使用 getTimezoneOffset() 方法,该方法返回的值表示 Date 对象的时区与 UTC 之间相差的分钟数。此方法之所以返回以分钟为单位的值,是因为并不是所有时区之间都正好相差一个小时,有些时区与邻近的时区仅相差半个小时。

以下示例使用时区偏移量将日期从本地时间转换成 UTC。该示例首先以毫秒为单位计算时区值,然后按照该量调整 Date 值:

// creates a Date in local time 
var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM"); 
 
// converts the Date to UTC by adding or subtracting the time zone offset 
var offsetMilliseconds:Number = nextDay.getTimezoneOffset() * 60 * 1000; 
nextDay.setTime(nextDay.getTime() + offsetMilliseconds);