2013-01-12 32 views
18

Już używa pliku Date.js, ale w razie potrzeby można również użyć innej biblioteki.Praca z okresem czasu w JavaScript

Nie jestem pewien, jaki jest najlepszy sposób pracy z deltami czasowymi. W szczególności chcę wyświetlić czas, który minął od teraz do przeszłości i daty.

Więc muszę zrobić coś takiego:

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

zdążyłeś go głównie pracować używając Date.js, ale problem jest teraz pracuję z obiektu Date a nie zakresu czasu, więc co powinien być odstęp czasu wynosi 23 godzin zamiast 23 godzin po terminie za pierwszy raz:

 
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 

Co potrzebne jest:

 
0 days 23 hours 17 minutes and 32 seconds 

Jakieś pomysły?

Odpowiedz

45

Brzmi jak trzeba moment.js

np

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

=> ostatnia niedzielę o godzinie 20:23

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

=> 26 minut temu

Edit:

Czysta kalkulacja JS data 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

jestem nie wiesz, czy to pomaga w drukowaniu upływającego czasu w dniach, godzinach minutach, sekundach? –

+2

Tak, też inny facet też się temu przyjrzał. Nawet z plikiem moment.js nie ma wystarczająco dużo opcji "formatu" w danym przedziale czasowym. Sposób, w jaki musieliśmy to zrobić, był ręczny, tak jak powyżej. –

+0

ok, by wspomnieć o chwile chwili.js, ale w jaki sposób dany kod moment.js odpowiada na pytanie OP? –

6

Jeśli nie jesteś zbyt zaniepokojeni dokładności po kilku dniach, można po prostu zrobić matematyki

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

następnie timeSince(pastDate); i wykorzystać właściwości, jak chcesz.

Inaczej można użyć .getUTC* to obliczyć, ale należy pamiętać, że może być nieco wolniejszy obliczyć

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 zapewnia taką funkcjonalność:

http://momentjs.com/

Jest dobrze udokumentowane i miła biblioteka.

Należy iść wzdłuż linii "czas" i „uczłowieczyć 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

Sprawdziłem całą dokumentację, a także wykonałem próbę i błąd. Nie mogłem wymyślić, jak to zrobić za pomocą pliku moment.js. Jeśli możesz pokazać, jak to zrobić z plikiem moment.js, byłoby świetnie. Inne odpowiedzi pokazują, jak zrobić to ręcznie, czego starałem się uniknąć. –

+0

Uświęcona odpowiedź ... z nadzieją daje więcej wskazówek. Nigdy tego nie robiłem. –

+0

Jestem prawie pewien, że to nie działa. Wydaje się drukować coś takiego "kilka sekund temu". Nie mogę powiedzieć, żeby wydrukował rzeczy typu "HH: MM: SS". –

1

Można użyć momentjsduration Przedmiotem

Przykład:

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

Czy możesz zmienić komentarze na angielski, aby inni mogli je zrozumieć? – Shiko