使用javascript计算运行时间
Calculate time elapsed using javascript
我想使用JavaScript以(年、月、日、小时、分钟、秒)的形式计算自我生日以来所用的时间。
例如,我的出生日期是1989年10月15日,00小时00分00秒。因此,从我的出生日期起经过的时间是,
22 years 5 months 10 days 19 hours 25 minutes 25 seconds
我希望使用JavaScript代码实现相同的输出。在这种情况下,任何联系都肯定会有所帮助。
试试这样的东西:
var now = new Date();
var bDay = new Date(1989, 10, 15);
var elapsedT = now - bDay; // in ms
阅读MDN了解更多信息。这将使您了解如何格式化结果。
由于我之前的回答让人们完全忽略了这一点,这里有一个PHP代码端口,我必须做同样的事情:
function getDaysInMonth(month,year) {
if( typeof year == "undefined") year = 1999; // any non-leap-year works as default
var currmon = new Date(year,month),
nextmon = new Date(year,month+1);
return Math.floor((nextmon.getTime()-currmon.getTime())/(24*3600*1000));
}
function getDateTimeSince(target) { // target should be a Date object
var now = new Date(), diff, yd, md, dd, hd, nd, sd, out = [];
diff = Math.floor(now.getTime()-target.getTime()/1000);
yd = target.getFullYear()-now.getFullYear();
md = target.getMonth()-now.getMonth();
dd = target.getDate()-now.getDate();
hd = target.getHours()-now.getHours();
nd = target.getMinutes()-now.getMinutes();
sd = target.getSeconds()-now.getSeconds();
if( md < 0) {yd--; md += 12;}
if( dd < 0) {
md--;
dd += getDaysInMonth(now.getMonth()-1,now.getFullYear());
}
if( hd < 0) {dd--; hd += 24;}
if( md < 0) {hd--; md += 60;}
if( sd < 0) {md--; sd += 60;}
if( yd > 0) out.push( yd+" year"+(yd == 1 ? "" : "s"));
if( md > 0) out.push( md+" month"+(md == 1 ? "" : "s"));
if( dd > 0) out.push( dd+" day"+(dd == 1 ? "" : "s"));
if( hd > 0) out.push( hd+" hour"+(hd == 1 ? "" : "s"));
if( nd > 0) out.push( nd+" minute"+(nd == 1 ? "" : "s"));
if( sd > 0) out.push( sd+" second"+(sd == 1 ? "" : "s"));
return out.join(" ");
}
示例:
getDateTimeSince(new Date(1992,1,6,22,30,00));
// my date of birth - near enough half past ten in the evening on Feb 6th 1992
> 20 years 1 month 18 days 17 hours 23 minutes 7 seconds
我相信这正是OP所要求的。
首先,您的需求有点不精确。我们知道一分钟=60秒,一小时=60分钟。。。它就停在这里。一天可以是24小时,也可以只是24小时多一点,这取决于你如何对待闰年,而"一个月"甚至不能准确地代表时间跨度。
因此:要么将时间跨度保持为小时,要么建立一个近似值来处理闰年等。日期和日期差异(时间跨度)是不同的概念,需要始终区别对待。
无论如何,至于代码,我只会选择:
var ms = new Date() - yourBirthDate;
var secs = ms/1000;
var minutes = secs / 60 ; secs = secs % 60;
var hours = minutes / 60 ; minutes = minutes % 60;
// and so on if you want
使用Moment.js在Javascript中解析、验证、操作和格式化日期。现在只有5.5k,这并不是自己编写这种低级代码的好理由。
http://momentjs.com/
查看JavaScriptDate对象。具体来说,在该页面上,查找"计算运行时间"部分(底部附近):
// using static methods
var start = Date.now();
// the event you'd like to time goes here:
doSomethingForALongTime();
var end = Date.now();
var elapsed = end - start; // time in milliseconds
在您的情况下,start
将是一个给定的日期:
var start = new Date(1989,10,15);
如果你想计算天数,甚至周数,你只需从生日的时间戳中减去当前的时间戳,并将数字划分为其组成时间单位即可。
然而,如果你想要几个月和几年,由于一个月的天数可变,这就有点复杂了。
也许最简单的方法如下:
- 获取年份差异(currentYear-birthYear)
- 获取月份差异(currentMonth-birthMonth)
- 对所有单元重复
- 如果任何一个单位是负的,从上面的单位中减去1,再加上当前单位的多少,就可以构成更大的单位
当你想知道一个月有多少天时,就会出现复杂的情况。这可以帮助:
function getDaysInMonth(month,year) {
if( typeof year == "undefined") year = 1999; // any non-leap-year works as default
var currmon = new Date(year,month),
nextmon = new Date(year,month+1); // no need to check for December overflow - JS does this automatically
return Math.floor((nextmon.getTime()-currmon.getTime())/24*3600);
}
这应该足以让你走上正轨。如果你需要更多的帮助,请告诉我。
function getDaysInMonth(month,year) {
if( typeof year == "undefined") year = 1999; // any non-leap-year works as default
var currmon = new Date(year,month),
nextmon = new Date(year,month+1);
return Math.floor((nextmon.getTime()-currmon.getTime())/(24*3600*1000));
}
function getDateTimeSince(target) { // target should be a Date object
var now = new Date(), yd, md, dd, hd, nd, sd, out = [];
yd = now.getFullYear()-target.getFullYear();
md = now.getMonth()-target.getMonth();
dd = now.getDate()-target.getDate();
hd = now.getHours()-target.getHours();
nd = now.getMinutes()-target.getMinutes();
sd = now.getSeconds()-target.getSeconds();
if( md < 0) {yd--; md += 12;}
if( dd < 0) {
md--;
dd += getDaysInMonth(now.getMonth()-1,now.getFullYear());
}
if( hd < 0) {dd--; hd += 24;}
if( nd < 0) {hd--; nd += 60;}
if( sd < 0) {nd--; sd += 60;}
if( yd > 0) out.push( yd+" year"+(yd == 1 ? "" : "s"));
if( md > 0) out.push( md+" month"+(md == 1 ? "" : "s"));
if( dd > 0) out.push( dd+" day"+(dd == 1 ? "" : "s"));
if( hd > 0) out.push( hd+" hour"+(hd == 1 ? "" : "s"));
if( nd > 0) out.push( nd+" minute"+(nd == 1 ? "" : "s"));
if( sd > 0) out.push( sd+" second"+(sd == 1 ? "" : "s"));
return out.join(" ");
}
这是Kolink代码的另一个版本。他的脚本中出现了许多错误,导致该脚本无法正常运行。。。
这里有一种计算运行时间的简单方法。
- 计算起始日期和今天之间的差异(以毫秒为单位)
- 将此差异传递给名为result的Date对象
- 请记住,根据日期对象定义,该结果对象为1970年1月1日00:00:00后的毫秒
- 检查此结果对象以获得Years、Months等
这是这样做的代码。
Date.prototype.getElapsedTime = function() {
var diffDate = new Date(Date.now() - this);
return "Elapsed Time: Years: " + (diffDate.getFullYear() - 1970) + ", Months: " + diffDate.getMonth() + ", Days: " + (diffDate.getDate() - 1) + ", Hours: " + diffDate.getHours() + ", Minutes: " + diffDate.getMinutes() + ", Seconds: " + diffDate.getSeconds();
};
var from = new Date("01/08/1986 04:07:00");
document.getElementById("result").innerHTML = from.getElapsedTime();
这里有一些你可以玩的东西:https://jsfiddle.net/nishchal/u8gt2gwq/4/
我喜欢这个:
function lifeSpan(t0) {var x=new Date()-t0, a=x, i=0,s=0,m=0,h=0,j=0;
if(a>=1){i=a%1000;a=(a-i)/1000;
if(a>=1){s=a%60;a=(a-s)/60;
if(a>=1){m=a%60;a=(a-m)/60;
if(a>=1){h=a%24;a=(a-h)/24;
if(a>=1){j=a;//...
}}}}}
return 'Elapsed: '+i+'ms '+s+'s '+m+'mn '+h+'h '+j+'j (or '+x+'ms).';}
下面是一个显示自unix/epoch时间戳以来经过的时间的快速算法:
const showElapsedTime = (timestamp) => {
if (typeof timestamp !== 'number') return 'NaN'
const SECOND = 1000
const MINUTE = 1000 * 60
const HOUR = 1000 * 60 * 60
const DAY = 1000 * 60 * 60 * 24
const MONTH = 1000 * 60 * 60 * 24 * 30
const YEAR = 1000 * 60 * 60 * 24 * 30 * 12
const elapsed = ((new Date()).valueOf() - timestamp)
if (elapsed <= MINUTE) return `${Math.round(elapsed / SECOND)}s`
if (elapsed <= HOUR) return `${Math.round(elapsed / MINUTE)}m`
if (elapsed <= DAY) return `${Math.round(elapsed / HOUR)}h`
if (elapsed <= MONTH) return `${Math.round(elapsed / DAY)}d`
if (elapsed <= YEAR) return `${Math.round(elapsed / MONTH)}mo`
return `${Math.round(elapsed / YEAR)}y`
}
const createdAt = 1541301301000
console.log(showElapsedTime(createdAt + 5000000))
console.log(showElapsedTime(createdAt))
console.log(showElapsedTime(createdAt - 500000000))
(new Date()).valueOf()
返回自1970年1月1日以来经过的秒数。
得到后,您只需要事件的时间戳,就可以从当前时间中减去它。这留下了经过的秒数,可以通过除以正确的单位数将其转换为人类可读的格式。
例如,3000毫秒就是300秒。我展示的算法使用毫秒时间戳(以秒为单位将所有内容除以1000),因此在算法中,3000将大于MINUTE
但小于HOUR
,因此它将返回3000 / MINUTE
并返回3s
。
如果您正在显示卡片,例如发布2d ago
的职位发布,则此算法非常有用。
我不喜欢我找到的大多数其他答案,因为它们不够简单或可读。我希望我的回答能很快被理解。
以下是查找逝去时间的简单算法:
time_elapsed_string = function(ptime){
var etime = (Date.now() / 1000 | 0 ) - ptime;
if (etime < 1)
{
return '0 seconds';
}
var a = {'31536000' : 'year',
'2592000' : 'month',
'86400' : 'day',
'3600' : 'hour',
'60' : 'minute',
'1' : 'second'
};
var a_plural = { 'year' : 'years',
'month' : 'months',
'day' : 'days',
'hour' : 'hours',
'minute' : 'minutes',
'second' : 'seconds'
};
var output = '';
$.each(a,function(secs,str){
var d = etime / secs;
if (d >= 1){
var r = Math.round(d);
output = r + ' ' + (r > 1 ? a_plural[str] : str) + ' ago';
return true;
}
});
return output;
}
我提出了以下内容:
let getTimeElpasedString = (datetime, depth=1 )=>{
/*
depth = 0 means start at milliseconds
depth = 1 means start at seconds
...
*/
datetime = Date.parse(datetime).getElapsed()
console.log(datetime)
let dividers = [1000, 60, 60, 24, 7]
let str = ''
let units = ["milliseconds", "seconds", "minutes", "hours", "days"]
let reminders = []
dividers.forEach(d=>{
reminders.push(datetime % d)
datetime = parseInt(datetime/d)
})
reminders = reminders.slice(depth).reverse()
units = units.slice(depth).reverse()
for(let i=0; i<reminders.length; i++){
// skip which is equal to zero
if(reminders[i] != 0)
str += `${reminders[i]} ${units[i]} `
}
return str + "ago"
}
- HTML5画布-暂停时的运行时间
- 根据时间计算运动
- 如何在Node.js中获得服务器正常运行时间
- 在JS中获取运行时间
- JQuery 选择器运行时间
- 高图表动态不同的时间计算
- 使用属性获取对象值的运行时间
- 距离 = 速率 * 时间计算
- 日期时间计算问题
- Google Apps 脚本在保护多个范围时运行时间非常慢
- 创建可重复使用的运行时计算的样式表样式
- Node.js以及如何在应用程序中获得正常运行时间/启动时间
- 使用javascript计算运行时间
- 如何格式化setInterval方法JavaScript的运行时间
- javascript中的日期时间计算库
- requestAnimationFrame计算运行时间
- 关于重构jQuery持续时间计算的建议
- 使用AJAX将客户端运行时间记录到服务器日志文件中
- 改进计算二叉树中节点值最大和的函数的运行时间
- 使用Js计算函数的平均运行时间