2013-01-12 72 views
18

Sử dụng Date.js rồi, nhưng cũng có thể sử dụng thư viện khác nếu cần.Làm việc với một khoảng thời gian trong Javascript

Không chắc chắn cách tốt nhất để làm việc với đồng bằng thời gian là gì. Cụ thể, tôi muốn hiển thị thời gian đã trôi qua giữa giờ và ngày giờ trong quá khứ.

Vì vậy, tôi cần phải làm một cái gì đó như thế này:

var elapsed_time = new Date() - pastDate; 
pastDate.toString('days-hours-minutes-seconds'); 

nhận được nó để làm việc chủ yếu sử dụng Date.js, nhưng vấn đề là bây giờ tôi đang làm việc với một đối tượng ngày và không phải là một khoảng thời gian, vì vậy những gì phải là một khoảng thời gian 23 giờ thay vì 23 giờ sau khi lần đầu tiên của ngày:

 
var result = (new Date()) - past_date; 
"result" is the number (probably milliseconds): 15452732 
 
var result = (new Date() - past_date 
"result" is a date from 1969: Wed Dec 31 1969 23:17:32 

những gì tôi cần là:

 
0 days 23 hours 17 minutes and 32 seconds 

Bất kỳ ý tưởng nào?

Trả lời

45

Có vẻ như bạn cần moment.js

ví dụ:

moment().subtract('days', 6).calendar(); 

=> chủ nhật tuần trước tại 20:23

moment().startOf('hour').fromNow(); 

=> 26 phút trước

Edit:

tinh khiết tính JS ngày diff:

var date1 = new Date("7/Nov/2012 20:30:00"); 
 
var date2 = new Date("20/Nov/2012 19:15:00"); 
 

 
var diff = date2.getTime() - date1.getTime(); 
 

 
var days = Math.floor(diff/(1000 * 60 * 60 * 24)); 
 
diff -= days * (1000 * 60 * 60 * 24); 
 

 
var hours = Math.floor(diff/(1000 * 60 * 60)); 
 
diff -= hours * (1000 * 60 * 60); 
 

 
var mins = Math.floor(diff/(1000 * 60)); 
 
diff -= mins * (1000 * 60); 
 

 
var seconds = Math.floor(diff/(1000)); 
 
diff -= seconds * (1000); 
 

 
document.write(days + " days, " + hours + " hours, " + mins + " minutes, " + seconds + " seconds");

+0

Tôi không chắc chắn điều này hỗ trợ in ra thời gian trôi qua trong ngày, giờ phút, giây? –

+2

Vâng, có một anh chàng khác nhìn vào nó. Ngay cả với moment.js, không có đủ tùy chọn "định dạng" trên khoảng thời gian. Cách chúng tôi phải làm điều đó là thủ công như bạn có ở trên. –

+0

ok để đề cập đến moment.js, nhưng mã moment.js đã cho trả lời câu hỏi của OP như thế nào? –

6

Nếu bạn không quá lo lắng về độ chính xác sau những ngày, bạn chỉ có thể làm toán

function timeSince(when) { // this ignores months 
    var obj = {}; 
    obj._milliseconds = (new Date()).valueOf() - when.valueOf(); 
    obj.milliseconds = obj._milliseconds % 1000; 
    obj._seconds = (obj._milliseconds - obj.milliseconds)/1000; 
    obj.seconds = obj._seconds % 60; 
    obj._minutes = (obj._seconds - obj.seconds)/60; 
    obj.minutes = obj._minutes % 60; 
    obj._hours = (obj._minutes - obj.minutes)/60; 
    obj.hours = obj._hours % 24; 
    obj._days = (obj._hours - obj.hours)/24; 
    obj.days = obj._days % 365; 
    // finally 
    obj.years = (obj._days - obj.days)/365; 
    return obj; 
} 

sau đó timeSince(pastDate); và sử dụng các thuộc tính như bạn muốn.

Nếu không bạn có thể sử dụng .getUTC* để tính toán nó, nhưng lưu ý nó có thể hơi chậm hơn để tính toán

function timeSince(then) { 
    var now = new Date(), obj = {}; 
    obj.milliseconds = now.getUTCMilliseconds() - then.getUTCMilliseconds(); 
    obj.seconds = now.getUTCSeconds() - then.getUTCSeconds(); 
    obj.minutes = now.getUTCMinutes() - then.getUTCMinutes(); 
    obj.hours = now.getUTCHours() - then.getUTCHours(); 
    obj.days = now.getUTCDate() - then.getUTCDate(); 
    obj.months = now.getUTCMonth() - then.getUTCMonth(); 
    obj.years = now.getUTCFullYear() - then.getUTCFullYear(); 
    // fix negatives 
    if (obj.milliseconds < 0) --obj.seconds, obj.milliseconds = (obj.milliseconds + 1000) % 1000; 
    if (obj.seconds < 0) --obj.minutes, obj.seconds = (obj.seconds + 60) % 60; 
    if (obj.minutes < 0) --obj.hours, obj.minutes = (obj.minutes + 60) % 60; 
    if (obj.hours < 0) --obj.days, obj.hours = (obj.hours + 24) % 24; 
    if (obj.days < 0) { // months have different lengths 
     --obj.months; 
     now.setUTCMonth(now.getUTCMonth() + 1); 
     now.setUTCDate(0); 
     obj.days = (obj.days + now.getUTCDate()) % now.getUTCDate(); 
    } 
    if (obj.months < 0) --obj.years, obj.months = (obj.months + 12) % 12; 
    return obj; 
} 
0

Moment.js cung cấp chức năng như:

http://momentjs.com/

Nó cũng ghi nhận và thư viện đẹp.

Nó nên đi dọc theo dòng "Thời gian" và "nhân đạo của API http://momentjs.com/docs/#/displaying/from/

var d1, d2; // Timepoints 
var differenceInPlainText = moment(a).from(moment(b), true); // Add true for suffixless text 
+0

Tôi đã xem qua toàn bộ tài liệu cũng như đã thực hiện một số thử nghiệm và lỗi. Tôi không thể tìm ra cách để làm điều đó với moment.js Nếu bạn có thể chỉ ra cách làm điều đó với moment.js, điều đó thật tuyệt vời. Các câu trả lời khác cho thấy làm thế nào để làm điều đó bằng tay, đó là những gì tôi đã cố gắng để tránh. –

+0

Clairified câu trả lời ... hy vọng cho nhiều manh mối hơn. Không bao giờ làm điều này bản thân mình. –

+0

Tôi khá chắc chắn rằng nó không hoạt động. Có vẻ như in ra một cái gì đó như thế này "một vài giây trước". Không thể yêu cầu nó in ra "HH: MM: SS". –

1

Bạn có thể sử dụng momentjsduration đối tượng

Ví dụ:

const diff = moment.duration(Date.now() - new Date(2010, 1, 1)) 
console.log(`${diff.years()} years ${diff.months()} months ${diff.days()} days ${diff.hours()} hours ${diff.minutes()} minutes and ${diff.seconds()} seconds`) 
0
/** 
* 计算时间对象与当前时间的差距,并显示友好的文本 
*/ 
function date2Text(date) { 
    var milliseconds = new Date() - date; 
    var timespan = new TimeSpan(milliseconds); 
    if (milliseconds < 0) { 
     return timespan.toString() + "之后"; 
    }else{ 
     return timespan.toString() + "前"; 
    } 
} 

/** 
* 用于计算时间间隔的对象 
* @param milliseconds 毫秒数 
*/ 
var TimeSpan = function (milliseconds) { 
    milliseconds = Math.abs(milliseconds); 
    var days = Math.floor(milliseconds/(1000 * 60 * 60 * 24)); 
    milliseconds -= days * (1000 * 60 * 60 * 24); 

    var hours = Math.floor(milliseconds/(1000 * 60 * 60)); 
    milliseconds -= hours * (1000 * 60 * 60); 

    var mins = Math.floor(milliseconds/(1000 * 60)); 
    milliseconds -= mins * (1000 * 60); 

    var seconds = Math.floor(milliseconds/(1000)); 
    milliseconds -= seconds * (1000); 
    return { 
     getDays: function() { 
      return days; 
     }, 
     getHours: function() { 
      return hours; 
     }, 
     getMinuts: function() { 
      return mins; 
     }, 
     getSeconds: function() { 
      return seconds; 
     }, 
     toString: function() { 
      var str = ""; 
      if (days > 0 || str.length > 0) { 
       str += days + "天"; 
      } 
      if (hours > 0 || str.length > 0) { 
       str += hours + "小时"; 
      } 
      if (mins > 0 || str.length > 0) { 
       str += mins + "分钟"; 
      } 
      if (days == 0 && (seconds > 0 || str.length > 0)) { 
       str += seconds + "秒"; 
      } 
      return str; 
     } 
    } 
} 
+0

Bạn có thể thay đổi nhận xét sang tiếng Anh để mọi người có thể thêm hiểu không. – Shiko

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