使用javascript计算经过的时间

时间:2012-03-25 14:10:50

标签: javascript

我想用JavaScript计算自生日以来经过的时间(年,月,日,小时,分钟,秒)。

例如,我的出生日期是1989年10月15日00:00 00分00秒。因此,自我出生日期起经过的时间是,

22 years 5 months 10 days 19 hours 25 minutes 25 seconds 

我想使用JavaScript代码实现相同的输出。在这种情况下,任何链接都肯定会有所帮助。

12 个答案:

答案 0 :(得分:11)

尝试这样的事情:

var now = new Date();
var bDay = new Date(1989, 10, 15);
var elapsedT = now - bDay; // in ms

阅读MDN了解更多信息。这会让你知道如何格式化结果。

答案 1 :(得分:8)

由于我之前的回答让人们完全忽略了这一点,这里是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所要求的。

答案 2 :(得分:6)

首先,你要的是有点不精确。我们知道一分钟= 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

答案 3 :(得分:2)

看看JavaScript Date object。具体来说,在该页面上,查找“计算经过时间”部分(靠近底部):

// 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);

答案 4 :(得分:2)

如果您想计算天数,甚至几周,您只需从生日时间戳中减去当前时间戳并将数字除以其组件时间单位即可。

但是如果你想要几个月和几年,由于一个月内的天数变化,它会有点复杂。

最简单的方法可能如下:

  1. 获得多年的差异(currentYear - birthYear)
  2. 获得月份差异(currentMonth - birthMonth)
  3. 对所有单位重复
  4. 如果任何单位为负数,则从上面的单位中减去1,然后添加许多当前单位构成较大的单位。
  5. 当您想要查找给定月份中的天数时,会出现并发症。这有助于:

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

    这足以让你走上正轨。如果您需要更多帮助,请告诉我。

答案 5 :(得分:2)

使用Moment.js在Javascript中解析,验证,操作和格式化日期。这些天你自己做这种低级代码只有5.5k这么好的理由。

http://momentjs.com/

答案 6 :(得分:2)

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代码的另一个版本。他的一些错误阻止了这个脚本正常工作......

答案 7 :(得分:1)

这是计算经过时间的简便方法。

  1. 计算原始日期与今天之间的差异(以毫秒为单位)
  2. 将此差异传递给名为result
  3. 的Date对象
  4. 请记住,从日期对象定义中,结果对象是从01/01/1970 00:00:00开始的毫秒。
  5. 检查此结果对象以获取年,月等。
  6. 以下是执行此操作的代码。

    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/

答案 8 :(得分:0)

我喜欢这个:

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).';}

答案 9 :(得分:0)

这是一种显示自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,因此它将返回{{1} },然后返回3000 / MINUTE

如果您要显示卡片(例如已发布3s的职位发布),此算法很有用。

我不喜欢找到的大多数其他答案,因为它们不够简单或可读性强。我希望我的答案能很快理解。

答案 10 :(得分:0)

以下是用于查找经过时间的简单算法:

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

答案 11 :(得分:0)

我想出了以下几点:

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