管理月曆日期和時間

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

ActionScript 3.0 中的月曆日期和時間管理功能都集中在最上層的 Date 類別。Date 類別包含方法和屬性,可讓您以 Coordinated Universal Time (UTC) 或某個時區的本地時間處理日期和時間。UTC 是標準時間定義,基本上與格林威治標準時間 (GMT) 相同。

建立 Date 物件

Date 類別可說是所有核心類別當中,用途最廣的建構函式方法之一。您可以用四種不同方式叫用這個類別。

首先,如果不提供參數,Date() 建構函式會傳回 Date 物件,其中包含目前日期和時間,以您的時區的本地時間表示。以下是範例:

var now:Date = new Date();

第二,如果指定一個數字參數,Date() 建構函式會將該數字視為是自 1970 年 1 月 1 日起算的毫秒數,然後傳回相對應的 Date 物件。請注意,您所傳遞的毫秒值會視為是自 1970 年 1 月 1 日 (UTC) 起算的毫秒數。但是,Date 物件會以您的本地時區來表示值,除非您使用 UTC 專屬方法來擷取和顯示值。如果是使用單一毫秒參數來建立新的 Date 物件,請務必將您的本地時間與 UTC 的時差列入計算。下列陳述式會建立 Date 物件,設為 1970 年 1 月 1 日當天午夜 (UTC):

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 來表示。下列陳述式會取得 Date 物件,設為 2000 年 1 月 1 日開始的午夜 (本地時間):

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 代表 1 月,一直到 11 代表 12 月

  • date 屬性:月份中日期別的月曆數字,範圍在 1 到 31 之間

  • day 屬性:以數字格式表示的星期別,0 代表星期日

  • hours 屬性:範圍在 0 到 23 之間

  • minutes 屬性

  • seconds 屬性

  • milliseconds 屬性

    實際上,Date 類別可提供多種方式來擷取每一個值。例如,您可以用四種不同方式取得 Date 物件的月份值:

  • month 屬性

  • getMonth() 方法

  • monthUTC 屬性

  • getMonthUTC() 方法

    這四種方式的效率其實都相同,因此您可以視應用程式所需,使用其中一種方式。

    上面所列的屬性都是總日期值的組件。例如,milliseconds 屬性不會超過 999,因為一到 1000,seconds 值就會增加 1,而 milliseconds 屬性會重設為 0。

    如果您想要以自 1970 年 1 月 1 日 (UTC) 起算的毫秒數取得 Date 物件的值,可以使用 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);