管理日历日期和时间

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

子主题

创建 Date 对象

获取时间单位值

执行日期和时间运算

在时区之间进行转换

创建 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;
// 获取一个表示自起始日期 1970 年 1 月 1 日后又过了一天时间的 Date 对象
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() 构造函数接受多种不同的字符串格式,如ActionScript 3.0 语言和组件参考》中所列。以下语句使用字符串值初始化一个新的 Date 对象:

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

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

获取时间单位值

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

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

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

刚才列出的属性表示总日期值的各个部分。例如,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 天以计算另一个日期:

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

// 加上 30 天以获得到期日期
var dueDate:Date = new Date(invoiceDate.getTime() + (30 * millisecondsPerDay));

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

在时区之间进行转换

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

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

// 按本地时间创建 Date
var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM");

// 通过加上或减去时区偏移量,将 Date 转换为 UTC
var offsetMilliseconds:Number = nextDay.getTimezoneOffset() * 60 * 1000;
nextDay.setTime(nextDay.getTime() + offsetMilliseconds);