创建 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 对象中的一个时间单位的值:
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 天以计算另一个日期:
// 将发票日期设置为今天的日期
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);