2008-10-03 136 views

回答

20

您可以将自纪元以来的两个日期时间转换为毫秒,执行算术运算,然后使用最终的毫秒来计算这些更高的时间跨度数字。

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中并不存在。

1

没有这样做的自动方式。使用提供的类可以达到的最好效果是获取date1.time和date2.time,以便从1970年1月1日起为两个数字提供毫秒数。然后你可以计算它们之间的毫秒数。通过一些基本的数学运算,你可以得出秒数,小时数,天数等。

1

为了准确起见,Russell的上述文章是正确的,直到你达到25天的差异,那么数字变得太大变量。 因此,声明millisecondDifference:Number;

有可能是记录的getTime()和的valueOf()之间存在一些差异,但实际上我无法看到它

26

我创建了一个时间跨度的ActionScript类具有相似的API,以System.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; 
} 
+1

@nchrysler - 我不建议添加新的特性别人的示例代码。尽管如此,随意添加您自己的答案与新功能。 – 2012-01-22 14:29:00

+0

@Erwinus - 有趣的,你能给我一个repro声明吗? – 2012-12-27 03:59:05

+0

你可以添加一个许可证吗?最好是Apache或BSD?不幸的是,有些人在没有许可证的情况下不能使用它。 – 2015-07-26 22:30:26

0

ArgumentValidation是另一类Szalays先生做了一些检查,以确保每种方法都有正确的价值来执行它的任务而不会导致无法识别的错误。它们对于TimeSpan类的工作非常重要,因此您可以将它们注释掉,并且类将正常工作。

丰富的可发布参数验证类在这里也因为它是非常方便的,但我会留下下来给他,P

4

对于这样的一个单一的功能,我更可取... [理查德·绍洛伊的代码凝聚]

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."; 
} 
1
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); 
相关问题