ActionScript 3.0 で、指定された 2 つの日付の間の日数、時間数、分数、および秒数を自動的に計算する方法はありますか?
基本的に、必要なのは .NET Timespan クラスに相当する ActionScript です。
何か案が?
ActionScript 3.0 で、指定された 2 つの日付の間の日数、時間数、分数、および秒数を自動的に計算する方法はありますか?
基本的に、必要なのは .NET Timespan クラスに相当する ActionScript です。
何か案が?
その空白を埋めるために System.TimeSpan と同様の API を使用して ActionScript TimeSpan クラスを作成しましたが、演算子のオーバーロードがないために違いがあります。次のように使用できます。
TimeSpan.fromDates(later, earlier).totalDays;
以下はクラスのコードです(大きな投稿で申し訳ありません-ユニットテストは含めません;)
/**
* Represents an interval of time
*/
public class TimeSpan
{
private var _totalMilliseconds : Number;
public function TimeSpan(milliseconds : Number)
{
_totalMilliseconds = Math.floor(milliseconds);
}
/**
* Gets the number of whole days
*
* @example In a TimeSpan created from TimeSpan.fromHours(25),
* totalHours will be 1.04, but hours will be 1
* @return A number representing the number of whole days in the TimeSpan
*/
public function get days() : int
{
return int(_totalMilliseconds / MILLISECONDS_IN_DAY);
}
/**
* Gets the number of whole hours (excluding entire days)
*
* @example In a TimeSpan created from TimeSpan.fromMinutes(1500),
* totalHours will be 25, but hours will be 1
* @return A number representing the number of whole hours in the TimeSpan
*/
public function get hours() : int
{
return int(_totalMilliseconds / MILLISECONDS_IN_HOUR) % 24;
}
/**
* Gets the number of whole minutes (excluding entire hours)
*
* @example In a TimeSpan created from TimeSpan.fromMilliseconds(65500),
* totalSeconds will be 65.5, but seconds will be 5
* @return A number representing the number of whole minutes in the TimeSpan
*/
public function get minutes() : int
{
return int(_totalMilliseconds / MILLISECONDS_IN_MINUTE) % 60;
}
/**
* Gets the number of whole seconds (excluding entire minutes)
*
* @example In a TimeSpan created from TimeSpan.fromMilliseconds(65500),
* totalSeconds will be 65.5, but seconds will be 5
* @return A number representing the number of whole seconds in the TimeSpan
*/
public function get seconds() : int
{
return int(_totalMilliseconds / MILLISECONDS_IN_SECOND) % 60;
}
/**
* Gets the number of whole milliseconds (excluding entire seconds)
*
* @example In a TimeSpan created from TimeSpan.fromMilliseconds(2123),
* totalMilliseconds will be 2001, but milliseconds will be 123
* @return A number representing the number of whole milliseconds in the TimeSpan
*/
public function get milliseconds() : int
{
return int(_totalMilliseconds) % 1000;
}
/**
* Gets the total number of days.
*
* @example In a TimeSpan created from TimeSpan.fromHours(25),
* totalHours will be 1.04, but hours will be 1
* @return A number representing the total number of days in the TimeSpan
*/
public function get totalDays() : Number
{
return _totalMilliseconds / MILLISECONDS_IN_DAY;
}
/**
* Gets the total number of hours.
*
* @example In a TimeSpan created from TimeSpan.fromMinutes(1500),
* totalHours will be 25, but hours will be 1
* @return A number representing the total number of hours in the TimeSpan
*/
public function get totalHours() : Number
{
return _totalMilliseconds / MILLISECONDS_IN_HOUR;
}
/**
* Gets the total number of minutes.
*
* @example In a TimeSpan created from TimeSpan.fromMilliseconds(65500),
* totalSeconds will be 65.5, but seconds will be 5
* @return A number representing the total number of minutes in the TimeSpan
*/
public function get totalMinutes() : Number
{
return _totalMilliseconds / MILLISECONDS_IN_MINUTE;
}
/**
* Gets the total number of seconds.
*
* @example In a TimeSpan created from TimeSpan.fromMilliseconds(65500),
* totalSeconds will be 65.5, but seconds will be 5
* @return A number representing the total number of seconds in the TimeSpan
*/
public function get totalSeconds() : Number
{
return _totalMilliseconds / MILLISECONDS_IN_SECOND;
}
/**
* Gets the total number of milliseconds.
*
* @example In a TimeSpan created from TimeSpan.fromMilliseconds(2123),
* totalMilliseconds will be 2001, but milliseconds will be 123
* @return A number representing the total number of milliseconds in the TimeSpan
*/
public function get totalMilliseconds() : Number
{
return _totalMilliseconds;
}
/**
* Adds the timespan represented by this instance to the date provided and returns a new date object.
* @param date The date to add the timespan to
* @return A new Date with the offseted time
*/
public function add(date : Date) : Date
{
var ret : Date = new Date(date.time);
ret.milliseconds += totalMilliseconds;
return ret;
}
/**
* Creates a TimeSpan from the different between two dates
*
* Note that start can be after end, but it will result in negative values.
*
* @param start The start date of the timespan
* @param end The end date of the timespan
* @return A TimeSpan that represents the difference between the dates
*
*/
public static function fromDates(start : Date, end : Date) : TimeSpan
{
return new TimeSpan(end.time - start.time);
}
/**
* Creates a TimeSpan from the specified number of milliseconds
* @param milliseconds The number of milliseconds in the timespan
* @return A TimeSpan that represents the specified value
*/
public static function fromMilliseconds(milliseconds : Number) : TimeSpan
{
return new TimeSpan(milliseconds);
}
/**
* Creates a TimeSpan from the specified number of seconds
* @param seconds The number of seconds in the timespan
* @return A TimeSpan that represents the specified value
*/
public static function fromSeconds(seconds : Number) : TimeSpan
{
return new TimeSpan(seconds * MILLISECONDS_IN_SECOND);
}
/**
* Creates a TimeSpan from the specified number of minutes
* @param minutes The number of minutes in the timespan
* @return A TimeSpan that represents the specified value
*/
public static function fromMinutes(minutes : Number) : TimeSpan
{
return new TimeSpan(minutes * MILLISECONDS_IN_MINUTE);
}
/**
* Creates a TimeSpan from the specified number of hours
* @param hours The number of hours in the timespan
* @return A TimeSpan that represents the specified value
*/
public static function fromHours(hours : Number) : TimeSpan
{
return new TimeSpan(hours * MILLISECONDS_IN_HOUR);
}
/**
* Creates a TimeSpan from the specified number of days
* @param days The number of days in the timespan
* @return A TimeSpan that represents the specified value
*/
public static function fromDays(days : Number) : TimeSpan
{
return new TimeSpan(days * MILLISECONDS_IN_DAY);
}
/**
* The number of milliseconds in one day
*/
public static const MILLISECONDS_IN_DAY : Number = 86400000;
/**
* The number of milliseconds in one hour
*/
public static const MILLISECONDS_IN_HOUR : Number = 3600000;
/**
* The number of milliseconds in one minute
*/
public static const MILLISECONDS_IN_MINUTE : Number = 60000;
/**
* The number of milliseconds in one second
*/
public static const MILLISECONDS_IN_SECOND : Number = 1000;
}
エポック以降の 2 つの日付時刻をミリ秒に変換し、計算を実行してから、結果のミリ秒を使用してこれらのより高いタイムスパン数を計算できます。
var someDate:Date = new Date(...);
var anotherDate:Date = new Date(...);
var millisecondDifference:int = anotherDate.valueOf() - someDate.valueOf();
var seconds:int = millisecondDifference / 1000;
....
LiveDocsは、この種のことにも役立ちます。ActionScript が少しずれていたら申し訳ありませんが、しばらく経ちました。
また、この種の計算を頻繁に行う場合は、これらの操作を実行できる一連の静的クラス メソッドを作成することをお勧めします。残念ながら、この基本機能は標準 API には実際には存在しません。
このようないくつかの単一の関数には、私が望ましいです...[RichardSzalayのコードから要約]
public function timeDifference(startTime:Date, endTime:Date) : String
{
if (startTime == null) { return "startTime empty."; }
if (endTime == null) { return "endTime empty."; }
var aTms = Math.floor(endTime.valueOf() - startTime.valueOf());
return "Time taken: "
+ String( int(aTms/(24*60*+60*1000)) ) + " days, "
+ String( int(aTms/( 60*60*1000)) %24 ) + " hours, "
+ String( int(aTms/( 60*1000)) %60 ) + " minutes, "
+ String( int(aTms/( 1*1000)) %60 ) + " seconds.";
}
正確を期すために、Russell による上記の投稿は、25 日の差に達するまで正しいものです。その後、int 変数に対して数値が大きくなりすぎます。したがって、millisecondDifference:Number; を宣言します。
文書化された getTime() と valueOf() の間にはいくつかの違いがあるかもしれませんが、実際にはそれを見ることができません
var timeDiff:Number = endDate - startDate;
var days:Number = timeDiff / (24*60*60*1000);
var rem:Number = int(timeDiff % (24*60*60*1000));
var hours:Number = int(rem / (60*60*1000));
rem = int(rem % (60*60*1000));
var minutes:Number = int(rem / (60*1000));
rem = int(rem % (60*1000));
var seconds:Number = int(rem / 1000);
trace(days + " << >> " +hours+ " << >> " +minutes+ " << >> " +seconds);
また
var time:Number = targetDate - currentDate;
var secs:Number = time/1000;
var mins:Number = secs/60;
var hrs:Number = mins/60;
var days:Number = int(hrs/24);
secs = int(secs % 60);
mins = int(mins % 60);
hrs = int(hrs % 24);
trace(secs + " << >> " + mins + " << >> " + hrs + " << >> " + days);
これを自動的に行う方法はありません。提供されたクラスで達成できる最善の方法は、date1.time と date2.time をフェッチして、1970 年 1 月 1 日からのミリ秒数を 2 つの数値に与えることです。次に、それらの間のミリ秒数を計算できます。いくつかの基本的な数学を使用して、秒、時間、日などを導き出すことができます。
ArgumentValidation は Szalays 氏の別のクラスで、認識できないエラーをスローすることなく、各メソッドがそのタスクを実行するための適切な値を持っていることを確認するためにいくつかのチェックを行います。これらは TimeSpan クラスを機能させるために必須ではないため、コメントアウトするだけでクラスが正しく機能します。
Rich は Argument 検証クラスをここに投稿するかもしれませんが、これは非常に便利ですが、それは彼に任せます ;P