2013-08-02 39 views
6

Tôi cần viết JavaScript cho phép tôi so sánh hai dấu thời gian ISO và sau đó in ra sự khác biệt giữa chúng, ví dụ: "32 giây".So sánh 2 dấu thời gian ISO 8601 và số giây đầu ra/phút

Dưới đây là một chức năng tôi tìm thấy trên Stack Overflow, nó biến một ngày bình thường thành một định dạng ISO. Vì vậy, đó là điều đầu tiên trên đường đi, nhận được thời gian hiện tại ở định dạng ISO.

Điều tiếp theo tôi cần làm là lấy một dấu thời gian ISO khác để so sánh nó với, tốt, tôi đã lưu trữ trong một đối tượng. Nó có thể được truy cập như thế này: marker.timestamp (như thể hiện trong đoạn code dưới đây). Bây giờ tôi cần so sánh hai dấu thời gian đó và tìm ra sự khác biệt giữa chúng. Nếu nó là < 60 giây, nó sẽ xuất ra trong vài giây, nếu nó> 60 giây, nó sẽ xuất ra 1 phút và 12 giây trước chẳng hạn.

Cảm ơn!

function ISODateString(d){ 
function pad(n){return n<10 ? '0'+n : n} 
return d.getUTCFullYear()+'-' 
     + pad(d.getUTCMonth()+1)+'-' 
     + pad(d.getUTCDate())+'T' 
     + pad(d.getUTCHours())+':' 
     + pad(d.getUTCMinutes())+':' 
     + pad(d.getUTCSeconds())+'Z'} 

var date = new Date(); 
var currentISODateTime = ISODateString(date); 
var ISODateTimeToCompareWith = marker.timestamp; 

// Now how do I compare them? 
+0

Vì vậy, bạn muốn so sánh 'currentISODateTime' với' ISODateTimeToCompareWith' và chúng đều ở định dạng ISO 8601? – federicot

+0

@Campari Có, chính xác điều đó, sau đó xuất ra sự khác biệt giữa chúng. Cả hai đều ở định dạng ISO 8601. – jskidd3

Trả lời

17

So sánh hai thời điểm là đơn giản như

var differenceInMs = dateNewer - dateOlder; 

Vì vậy, chuyển đổi các timestamps trở lại vào ngày trường

var d1 = new Date('2013-08-02T10:09:08Z'), // 10:09 to 
    d2 = new Date('2013-08-02T10:20:08Z'); // 10:20 is 11 mins 

Lấy chênh lệch

var diff = d2 - d1; 

Format này như mong muốn

if (diff > 60e3) console.log(
    Math.floor(diff/60e3), 'minutes ago' 
); 
else console.log(
    Math.floor(diff/1e3), 'seconds ago' 
); 
// 11 minutes ago 
+0

Cảm ơn. Bit 'e3' có ý nghĩa gì sau các con số? – jskidd3

+4

Tôi hiểu rồi, tôi lấy nó chỉ là một lối tắt cho 60k. : P – jskidd3

1

Tôi chỉ lưu đối tượng Ngày làm một phần của lớp ISODate của bạn. Bạn chỉ có thể thực hiện chuyển đổi chuỗi khi bạn cần hiển thị nó, nói theo phương thức toString. Bằng cách đó bạn chỉ có thể sử dụng logic rất đơn giản với lớp ngày để xác định sự khác biệt giữa hai ISODates:

var difference = ISODate.date - ISODateToCompare.date; 
if (difference > 60000) { 
    // display minutes and seconds 
} else { 
    // display seconds 
} 
1

tôi khuyên bạn nên nhận được thời gian trong vài giây từ cả hai timestamps, như thế này:

var firstDate = new Date(currentISODateTime), 
    secondDate = new Date(ISODateTimeToCompareWith), 
    firstDateInSeconds = firstDate.getTime() * 1000, 
    secondDateInSeconds = secondDate.getTime() * 1000, 
    difference = Math.abs(firstDateInSeconds - secondDateInSeconds); 

Và sau đó làm việc với difference. Ví dụ:

if (difference < 60) { 
    alert(difference + ' seconds'); 
} else if (difference < 3600) { 
    alert(Math.floor(difference/60) + ' minutes'); 
} else { 
    alert(Math.floor(difference/3600) + ' hours'); 
} 

Chú ý: Tôi đã từng Math.abs để so sánh số ngày trong vài giây để có được sự khác biệt tuyệt đối giữa chúng, bất kể đó là trước đó.

+0

Tôi thấy rằng bạn nên chia '(new Date (ISO)). GetTime()' thành 1000 thay vì nhân với 1000 để đạt được giá trị tính bằng giây. – eskimwier

Các vấn đề liên quan