2008-10-03 40 views

Trả lời

20

Bạn có thể bí mật hai lần ngày thành mili giây kể từ kỷ nguyên, thực hiện phép tính của bạn và sau đó sử dụng mili giây kết quả để tính số lần này cao hơn.

var someDate:Date = new Date(...); 
var anotherDate:Date = new Date(...); 
var millisecondDifference:int = anotherDate.valueOf() - someDate.valueOf(); 
var seconds:int = millisecondDifference/1000; 
.... 

LiveDocs cũng hữu ích cho loại điều này. Xin lỗi nếu ActionScript là một chút, nhưng nó đã được một thời gian.

Tôi cũng khuyên bạn nên tạo một tập hợp các phương thức lớp tĩnh có thể thực hiện các thao tác này nếu bạn đang thực hiện rất nhiều loại phép toán này. Đáng buồn thay, chức năng cơ bản này không thực sự tồn tại trong các API chuẩn.

1

Không có cách nào tự động thực hiện việc này. Điều tốt nhất bạn có thể đạt được với các lớp được cung cấp là lấy date1.time và date2.time, để cung cấp số lượng mili giây kể từ ngày 1 tháng 1 năm 1970 cho hai số. Sau đó, bạn có thể tính số mili giây giữa chúng. Với một số phép tính cơ bản, bạn có thể lấy số giây, giờ, ngày, vv

1

Vì lợi ích của độ chính xác, bài đăng trên của Russell là chính xác cho đến khi bạn có chênh lệch 25 ngày, thì số đó trở nên quá lớn đối với int biến. Do đó khai báo millisecondDifference: Number;

Có thể có một số khác biệt giữa getTime tài liệu() và valueOf(), nhưng trên thực tế tôi không thể nhìn thấy nó

26

Tôi tạo ra một lớp ActionScript TimeSpan với một API tương tự như System.TimeSpan để điền vào đó void, nhưng có sự khác biệt do thiếu sự vận hành quá tải. Bạn có thể sử dụng nó như vậy:

TimeSpan.fromDates(later, earlier).totalDays; 

Dưới đây là mã cho lớp (xin lỗi vì sự bài lớn - Tôi sẽ không bao gồm các đơn vị xét nghiệm;)

/** 
* 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 - Tôi không khuyên bạn nên thêm tính năng để mẫu mã của người khác. Tuy nhiên, vui lòng thêm câu trả lời của riêng bạn với các tính năng mới. –

+0

@Erwinus - Thú vị, bạn có thể cho tôi một tuyên bố repro không? –

+0

Bạn có thể thêm giấy phép vào nó không? Tốt hơn là một Apache hay BSD? Thật không may, một số người không thể sử dụng nó mà không có giấy phép được nêu. –

0

ArgumentValidation là một lớp Ông Szalays thực hiện một số kiểm tra để đảm bảo rằng mỗi phương pháp đều có giá trị phù hợp để thực hiện các nhiệm vụ của nó mà không phải ném các lỗi không thể nhận ra. Chúng không cần thiết để có được lớp TimeSpan hoạt động để bạn có thể bình luận chúng ra và lớp sẽ hoạt động chính xác.

Giàu thể gửi lớp xác nhận lập luận trên đây cũng như nó rất tiện dụng nhưng tôi sẽ rời khỏi đó xuống cho anh ta; P

+0

James là đúng, nó chỉ là một lớp tiện ích để giữ mã tiêu thụ sạch –

+0

... mặc dù cả hai câu trả lời này, và sideDoors câu trả lời nên có ý kiến;) –

4

cho một số chức năng duy nhất như thế này, tôi thích hợp hơn ... [ngưng tụ từ mã Richard Szalay của]

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."; 
} 
+0

Không chính xác. Không tính đến năm nhuận hoặc tháng feb có 29 ngày. –

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); 

hoặc

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); 
Các vấn đề liên quan