Travailler avec un intervalle de temps en Javascript
Utiliser La Date.js déjà, mais peut également utiliser une autre bibliothèque si nécessaire.
Je ne sais pas quelle est la meilleure façon de travailler avec les deltas temporels. Plus précisément, je veux montrer l'heure qui s'est écoulée entre maintenant et une date passée-l'heure.
Donc j'ai besoin de faire quelque chose comme ceci:
var elapsed_time = new Date() - pastDate;
pastDate.toString('days-hours-minutes-seconds');
Je L'ai obtenu pour la plupart du travail en utilisant la Date.js, mais le problème c'est que maintenant je travaille avec un objet Date et pas un temps, donc ce qui devrait être une durée de 23 heures est plutôt 23 heures après la Date de la première fois:
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
Ce dont j'ai besoin est:
0 days 23 hours 17 minutes and 32 seconds
des idées?
5 réponses
Sons comme vous avez besoin d' moment.js
e.g.
moment().subtract('days', 6).calendar();
=> dernier dimanche à 20: 23 PM
moment().startOf('hour').fromNow();
= > il y a 26 minutes
Edit:
pur js date diff calculation:
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");
si vous n'êtes pas trop inquiet en précision après des jours, vous pouvez simplement faire les maths
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;
}
timeSince(pastDate);
et utilisez les propriétés comme vous le souhaitez.
Sinon, vous pouvez utiliser .getUTC*
pour le calculer, mais notez qu'il peut être légèrement plus lent à calculer
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;
}
Vous pouvez utiliser momentjsdurée objet
Exemple:
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`)
Moment.js fournit de telles fonctionnalités:
c'est bien documenté et belle bibliothèque.
il devrait suivre les lignes "durée" et " humanisation de L'API http://momentjs.com/docs/#/displaying/from/
var d1, d2; // Timepoints
var differenceInPlainText = moment(a).from(moment(b), true); // Add true for suffixless text
/**
* 计算时间对象与当前时间的差距,并显示友好的文本
* English: Calculating the difference between the given time and the current time and then showing the results.
*/
function date2Text(date) {
var milliseconds = new Date() - date;
var timespan = new TimeSpan(milliseconds);
if (milliseconds < 0) {
return timespan.toString() + "之后";
}else{
return timespan.toString() + "前";
}
}
/**
* 用于计算时间间隔的对象
* English: Using a function to calculate the time interval
* @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;
}
}
}