使用javascript计算运行时间

Calculate time elapsed using javascript

本文关键字:运行时间 计算 javascript 使用      更新时间:2023-09-26

我想使用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);

如果你想计算天数,甚至周数,你只需从生日的时间戳中减去当前的时间戳,并将数字划分为其组成时间单位即可。

然而,如果你想要几个月和几年,由于一个月的天数可变,这就有点复杂了。

也许最简单的方法如下:

  1. 获取年份差异(currentYear-birthYear)
  2. 获取月份差异(currentMonth-birthMonth)
  3. 对所有单元重复
  4. 如果任何一个单位是负的,从上面的单位中减去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代码的另一个版本。他的脚本中出现了许多错误,导致该脚本无法正常运行。。。

这里有一种计算运行时间的简单方法。

  1. 计算起始日期和今天之间的差异(以毫秒为单位)
  2. 将此差异传递给名为result的Date对象
  3. 请记住,根据日期对象定义,该结果对象为1970年1月1日00:00:00后的毫秒
  4. 检查此结果对象以获得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"
}