カレンダー日付と時刻の管理

Flash Player 9 以降、Adobe AIR 1.0 以降

ActionScript 3.0 では、カレンダー日付と時刻の管理に関するすべての機能がトップレベルの Date クラスにまとめられています。 Date クラスには、世界標準時(UTC)または何らかのタイムゾーンに基づくローカル時間において日付と時刻を処理するメソッドおよびプロパティがあります。 UTC は時刻の基準となるもので、グリニッジ標準時(GMT)と基本的には同じです。

Date オブジェクトの作成

Date クラスは、すべてのコアクラスの中で最も多くの用途に使用できるコンストラクターメソッドを備えています。 このコンストラクターは次のように 4 つの方法で使用できます。

(1)パラメーターを指定しない場合、 Date() コンストラクターでは、動作環境のタイムゾーンにおけるローカル時間で現在の日付と時刻を格納した Date オブジェクトを返します。次に、その例を示します。

var now:Date = new Date();

(2)1 つの数値パラメーターを指定した場合、 Date() コンストラクターはその値を 1970 年 1 月 1 日からの経過ミリ秒数として解釈し、それに基づいた Date オブジェクトを返します。パラメーターは UTC の 1970 年 1 月 1 日を起点とする経過ミリ秒数として解釈されますが、 返される Date オブジェクトが示す値は、(UTC 用メソッドを使用して取得および表示しない限り) ローカルのタイムゾーンで表示されます。 ミリ秒数を表す 1 個のパラメーターを指定して Date オブジェクトを新規作成する際は、ローカル時間と UTC の間のタイムゾーンの時差に注意してください。 次のステートメントでは、UTC の 1970 年 1 月 1 日の深夜を表す 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);

(3)複数の数値パラメーターを Date() コンストラクターに渡すこともできます。その場合、コンストラクターでは各パラメーターを順に年、月、日、時、分、秒、ミリ秒の値と解釈し、それらに基づいた Date オブジェクトを返します。 パラメーターの値は UTC ではなくローカル時間を表すものと見なされます。 次のステートメントでは、ローカル時間の 2000 年 1 月 1 日午前 0 時を表す Date オブジェクトを作成します。

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

(4)1 つのストリングパラメーターを 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 プロパティ:1 月から 12 月を 0 ~ 11 で表す数値形式

  • date プロパティ:月の暦日を 1 ~ 31 で表す数値形式

  • day プロパティ:日曜日から土曜日を 0 ~ 6 で表す数値形式

  • hours プロパティ:時間を 0 ~ 23 で表す数値形式

  • minutes プロパティ

  • seconds プロパティ

  • milliseconds プロパティ

    また、Date クラスにはそれぞれの時間単位の値を取得する方法が複数用意されています。 例えば、Date オブジェクトに格納された月の値は次の 4 とおりの方法で取得できます。

  • month プロパティ

  • getMonth() メソッド

  • monthUTC プロパティ

  • getMonthUTC() メソッド

    4 つの方法は効率面ではいずれも同等なので、必要に応じて便利な方法を使用してください。

    上記のプロパティはそれぞれ、日付の値全体の一部を構成する要素を表しています。 例えば、milliseconds プロパティの値が 999 を超えることはありません。1000 に到達すると seconds プロパティの値が 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() メソッドを使用して、日付値を現在の時刻から 1 時間後に設定します。

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

日付値を設定するもう 1 つの方法は、ミリ秒を表す 1 個のパラメーターを使用して新しい 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));

次に、30 日単位の時間を表すために millisecondsPerDay 定数に 30 を掛け、その結果を invoiceDate 値に加えて dueDate 値の設定に使用します。

タイムゾーン間の変換

日付と時刻の演算処理は、あるタイムゾーンを別のタイムゾーンに換算する必要がある場合に便利です。 また、その際には、Date オブジェクトのタイムゾーンと UTC との時差(分)を返す getTimezoneOffset() メソッドも役立ちます。値が分単位で返されるのは、タイムゾーンによっては 1 時間未満の単位で時差が設定されており、隣接するタイムゾーンとの差が 30 分という場合があるためです。

次の例では、タイムゾーンのオフセットを使用してローカル時間の日付を 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);