Javascript返回两个日期之间的天数、小时数、分钟数、秒数

IT技术 javascript datetime
2021-01-16 06:15:02

有没有人可以将我链接到一些教程,在那里我可以找到如何在 2 个 unix 日期时间之间的 javascript 中返回天数、小时数、分钟数、秒数?

我有:

var date_now = unixtimestamp;
var date_future = unixtimestamp;

我想返回(实时)从 date_now 到 date_future 还剩多少天、小时、分钟、秒。

6个回答

只需找出以秒为单位的差异(不要忘记 JS 时间戳实际上以毫秒为单位)并分解该值:

// get total seconds between the times
var delta = Math.abs(date_future - date_now) / 1000;

// calculate (and subtract) whole days
var days = Math.floor(delta / 86400);
delta -= days * 86400;

// calculate (and subtract) whole hours
var hours = Math.floor(delta / 3600) % 24;
delta -= hours * 3600;

// calculate (and subtract) whole minutes
var minutes = Math.floor(delta / 60) % 60;
delta -= minutes * 60;

// what's left is seconds
var seconds = delta % 60;  // in theory the modulus is not required

编辑代码进行了调整,因为我刚刚意识到原始代码返回了总小时数等,而不是计算一整天后剩余的小时数。

我会var seconds = delta % 60;改为var seconds = Math.floor(delta % 60);
2021-03-19 06:15:02
谁能解释一下什么是86400、3600、60。为什么我们用它来计算?
2021-03-19 06:15:02
@BarryCarlyon 我不会 - OP 可能想知道那些四舍五入的毫秒数。
2021-03-25 06:15:02
一个有效的观点@alnitak,但在这种情况下,您可能希望将毫秒拆分为它自己的 var
2021-03-26 06:15:02
@BearNithi 他们是一天、一小时和一分钟的秒数。
2021-03-28 06:15:02

这是在javascript中:(例如,未来的日期是元旦)

DEMO(每秒更新一次)

var dateFuture = new Date(new Date().getFullYear() +1, 0, 1);
var dateNow = new Date();

var seconds = Math.floor((dateFuture - (dateNow))/1000);
var minutes = Math.floor(seconds/60);
var hours = Math.floor(minutes/60);
var days = Math.floor(hours/24);

hours = hours-(days*24);
minutes = minutes-(days*24*60)-(hours*60);
seconds = seconds-(days*24*60*60)-(hours*60*60)-(minutes*60);
唯一对我有用的!
2021-03-23 06:15:02

我将其称为“雪人 ☃ 方法”,我认为当您需要额外的时间跨度(如周、飞蛾、年、世纪……)并且不想要太多重复代码时,它会更灵活一些

var d = Math.abs(date_future - date_now) / 1000;                           // delta
var r = {};                                                                // result
var s = {                                                                  // structure
    year: 31536000,
    month: 2592000,
    week: 604800, // uncomment row to ignore
    day: 86400,   // feel free to add your own row
    hour: 3600,
    minute: 60,
    second: 1
};

Object.keys(s).forEach(function(key){
    r[key] = Math.floor(d / s[key]);
    d -= r[key] * s[key];
});

// for example: {year:0,month:0,week:1,day:2,hour:34,minute:56,second:7}
console.log(r);

FIDDLE/ ES6 Version (2018)/TypeScript Version (2019)

灵感来自Alnitak的回答。

让我的一天,谢谢
2021-03-22 06:15:02
请注意,此代码确实取决于按s指定顺序枚举的键,这仅在 ES2015 或更高版本中保证为真。
2021-03-31 06:15:02
请注意,此解决方案特定于包含 30 天的月份。此处不支持具有 28、29、31 天的月份。
2021-04-06 06:15:02
非常优雅的解决方案
2021-04-08 06:15:02

请注意,仅基于差异的计算不会涵盖所有情况:闰年和“夏令时”的切换。

Javascript 用于处理日期的内置库很差。我建议您使用第三方 javascript 库,例如MomentJS你可以在这里看到你正在寻找的功能。

我的解决方案没有那么清楚,但我把它作为另一个例子

console.log(duration('2019-07-17T18:35:25.235Z', '2019-07-20T00:37:28.839Z'));

function duration(t0, t1){
    let d = (new Date(t1)) - (new Date(t0));
    let weekdays     = Math.floor(d/1000/60/60/24/7);
    let days         = Math.floor(d/1000/60/60/24 - weekdays*7);
    let hours        = Math.floor(d/1000/60/60    - weekdays*7*24            - days*24);
    let minutes      = Math.floor(d/1000/60       - weekdays*7*24*60         - days*24*60         - hours*60);
    let seconds      = Math.floor(d/1000          - weekdays*7*24*60*60      - days*24*60*60      - hours*60*60      - minutes*60);
    let milliseconds = Math.floor(d               - weekdays*7*24*60*60*1000 - days*24*60*60*1000 - hours*60*60*1000 - minutes*60*1000 - seconds*1000);
    let t = {};
    ['weekdays', 'days', 'hours', 'minutes', 'seconds', 'milliseconds'].forEach(q=>{ if (eval(q)>0) { t[q] = eval(q); } });
    return t;
}

喜欢它,返回的结果相当于 postgres 对日期时间差异的处理。
2021-03-25 06:15:02