获取两个日期时间之间的时差

Get the time difference between two datetimes

本文关键字:时间 之间 时差 日期 两个 获取      更新时间:2023-09-26

我知道我可以做任何事情,还有一些更涉及的日期与momentjs。但令人尴尬的是,我很难尝试做一些看似简单的事情:获得 2 次之间的差异。

例:

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";
//expected result:
"00:39:30"

我尝试过:

var now = moment("04/09/2013 15:00:00");
var then = moment("04/09/2013 14:20:30");
console.log(moment(moment.duration(now.diff(then))).format("hh:mm:ss"))
//outputs 10:39:30  

我不明白那里的"10"是什么。我住在巴西,所以如果相关的话,我们是 utc-0300。

moment.duration(now.diff(then))的结果是具有正确内部值的持续时间:

 days: 0
 hours: 0
 milliseconds: 0
 minutes: 39
 months: 0
 seconds: 30
 years: 0

所以,我想我的问题是:如何将 momentjs 持续时间转换为时间间隔?我肯定可以使用

duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")

但我觉得还有更优雅的东西,我完全错过了。

更新
仔细看,在上面的例子中now是:

Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}

moment(moment.duration(now.diff(then)))是:

Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}

我不确定为什么第二个值在夏令时 (-0200)...但我确信我不喜欢约会:(

更新 2

好吧,该值是 -0200,可能是因为 31/12/1969 是使用夏令时的日期......所以就是这样。

仅当总持续时间小于 24 小时时,此方法才有效:

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";
moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")
// outputs: "00:39:30"

如果您有 24 小时或更长时间,则使用上述方法将小时数重置为零,因此并不理想。

如果您想在 24 小时或更长时间的持续时间内获得有效响应,则必须执行以下操作:

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";
var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = Math.floor(d.asHours()) + moment.utc(ms).format(":mm:ss");
// outputs: "48:39:30"

请注意,我使用的是 UTC 时间作为快捷方式。 您可以分别拔出d.minutes()d.seconds(),但您还必须将它们归零。

这是必要的,因为格式化duration异议的能力目前还没有.js。 这里已提出要求。 但是,有一个名为时刻持续时间格式的第三方插件专门用于此目的:

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";
var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = d.format("hh:mm:ss");
// outputs: "48:39:30"

你的问题是在格式化之前将 moment.duration() 的结果传递回 moment() ;这导致 moment() 将其解释为相对于 Unix 纪元的时间。

它不会为您提供所需的格式,但是

moment.duration(now.diff(then)).humanize()

会给你一个有用的格式,如"40分钟"。如果您非常热衷于这种特定的格式,则必须自己构建一个新字符串。一种便宜的方法是

[diff.asHours(), diff.minutes(), diff.seconds()].join(':')

哪里var diff = moment.duration(now.diff(then)).这不会为您提供个位数值的零填充。为此,您可能需要考虑像underscore.string这样的东西 - 尽管仅仅为了几个额外的零似乎还有很长的路要走。:)

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') //[days, years, months, seconds, ...]
//Result 1 

为我工作

查看更多http://momentjs.com/docs/#/displaying/difference/<</p>

div class="answers">

如果您只想将两个时间戳差为总天数,小时数和分钟数,而不是以月和年为单位。

var now  = "01/08/2016 15:00:00";
var then = "04/02/2016 14:20:30";
var diff = moment.duration(moment(then).diff(moment(now)));

diff 包含 2 个月、23 天、23 小时 20 分钟。但是我们只需要以天,小时和分钟为单位的结果,因此简单的解决方案是:

var days = parseInt(diff.asDays()); //84
var hours = parseInt(diff.asHours()); //2039 hours, but it gives total hours in given miliseconds which is not expacted.
hours = hours - days*24;  // 23 hours
var minutes = parseInt(diff.asMinutes()); //122360 minutes,but it gives total minutes in given miliseconds which is not expacted.
minutes = minutes - (days*24*60 + hours*60); //20 minutes.

最终结果将是:84天23小时20分钟。

当您调用 diff 时,moment.js 以毫秒为单位计算差异。如果毫秒被传递给duration,它被用来计算持续时间是正确的。然而。当您将相同的毫秒传递给moment()时,它会计算从 1970 年 1 月 1 日(午夜 UTC/GMT)开始(之后)纪元/UNIX 时间的毫秒日期。这就是为什么你把1969年作为错误的年份

duration.get("hours") +":"+ duration.get("minutes") +":"+ duration.get("seconds")

所以,我认为这就是你应该这样做的方式,因为 moment.js 不提供format持续时间的功能。或者你可以写一个简单的包装器来让它更容易/更漂亮。

这应该可以正常工作。

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";
var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
console.log(d.days() + ':' + d.hours() + ':' + d.minutes() + ':' + d.seconds());

如果我们只想要 hh:mm:ss,我们可以使用这样的函数:

//param: duration in milliseconds
MillisecondsToTime: function(duration) {
    var seconds = parseInt((duration/1000)%60)
        , minutes = parseInt((duration/(1000*60))%60)
        , hours = parseInt((duration/(1000*60*60))%24)
        , days  = parseInt(duration/(1000*60*60*24));
    var hoursDays = parseInt(days*24);
    hours += hoursDays;
    hours = (hours < 10) ? "0" + hours : hours;
    minutes = (minutes < 10) ? "0" + minutes : minutes;
    seconds = (seconds < 10) ? "0" + seconds : seconds;
    return hours + ":" + minutes + ":" + seconds;
}

使用这个:

var duration = moment.duration(endDate.diff(startDate));
var aa = duration.asHours();

而不是

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

最好做

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

这将适用于格式为 YYYY-MM-DD HH:mm:ss 的任何日期

const moment=require("moment");
let startDate=moment("2020-09-16 08:39:27");
const endDate=moment();

const duration=moment.duration(endDate.diff(startDate))
console.log(duration.asSeconds());
 console.log(duration.asHours());

在 ES8 中使用 moment,现在和开始成为 moment 对象。

const duration = moment.duration(now.diff(start));
const timespan = duration.get("hours").toString().padStart(2, '0') +":"+ duration.get("minutes").toString().padStart(2, '0') +":"+ duration.get("seconds").toString().padStart(2, '0');

打字稿:以下应该有效,

export const getTimeBetweenDates = ({
  until,
  format
}: {
  until: number;
  format: 'seconds' | 'minutes' | 'hours' | 'days';
}): number => {
  const date = new Date();
  const remainingTime = new Date(until * 1000);
  const getFrom = moment([date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()]);
  const getUntil = moment([remainingTime.getUTCFullYear(), remainingTime.getUTCMonth(), remainingTime.getUTCDate()]);
  const diff = getUntil.diff(getFrom, format);
  return !isNaN(diff) ? diff : null;
};
基于

日期时间的输入

    var dt1 = new Date("2019-1-8 11:19:16");
    var dt2 = new Date("2019-1-8 11:24:16");

    var diff =(dt2.getTime() - dt1.getTime()) ;
    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 response = {
        status : 200,
        Hour : hours,
        Mins : mins
    }

输出

{
"status": 200,
"Hour": 0,
"Mins": 5
}

以下方法适用于所有情况(小于 24 小时的日期和大于 24 小时的差值):

// Defining start and end variables
let start = moment('04/09/2013 15:00:00', 'DD/MM/YYYY hh:mm:ss');
let end   = moment('04/09/2013 14:20:30', 'DD/MM/YYYY hh:mm:ss');
// Getting the difference: hours (h), minutes (m) and seconds (s)
let h  = end.diff(start, 'hours');
let m  = end.diff(start, 'minutes') - (60 * h);
let s  = end.diff(start, 'seconds') - (60 * 60 * h) - (60 * m);
// Formating in hh:mm:ss (appends a left zero when num < 10)
let hh = ('0' + h).slice(-2);
let mm = ('0' + m).slice(-2);
let ss = ('0' + s).slice(-2);
console.log(`${hh}:${mm}:${ss}`); // 00:39:30

这将返回最大的时间段差异,例如(4 秒、2 分钟、1 小时、2 天、3 周、4 个月、5 年)。我最近用它来通知。

function dateDiff(startDate, endDate) {
    let arrDate = ["seconds", "minutes", "hours", "days", "weeks", "months", "years"];
    let dateMap = arrDate.map(e => moment(endDate).diff(startDate, e));
    let index = 6 - dateMap.filter(e => e == 0).length;
    return {
        type: arrDate[index] ?? "seconds",
        value: dateMap[index] ?? 0
    };
}


例:

dateDiff("2021-06-09 01:00:00", "2021-06-09 04:01:01")
{type: "hours", value: 3}

dateDiff("2021-06-09 01:00:00", "2021-06-12 04:01:01")
{type: "days", value: 3}

dateDiff("2021-06-09 01:00:00", "2021-06-09 01:00:10")
{type: "seconds", value: 10}

我用打字稿创建了一个简单的函数

const diffDuration: moment.Duration = moment.duration(moment('2017-09-04 12:55').diff(moment('2017-09-02 13:26')));
setDiffTimeString(diffDuration);
function setDiffTimeString(diffDuration: moment.Duration) {
  const str = [];
  diffDuration.years() > 0 ? str.push(`${diffDuration.years()} year(s)`) : null;
  diffDuration.months() > 0 ? str.push(`${diffDuration.months()} month(s)`) : null;
  diffDuration.days() > 0 ? str.push(`${diffDuration.days()} day(s)`) : null;
  diffDuration.hours() > 0 ? str.push(`${diffDuration.hours()} hour(s)`) : null;
  diffDuration.minutes() > 0 ? str.push(`${diffDuration.minutes()} minute(s)`) : null;
  console.log(str.join(', '));
} 
// output: 1 day(s), 23 hour(s), 29 minute(s)

用于生成 JavaScript https://www.typescriptlang.org/play/index.html

InTime=06:38,Outtime=15:40

 calTimeDifference(){
        this.start = dailyattendance.InTime.split(":");
        this.end = dailyattendance.OutTime.split(":");
        var time1 = ((parseInt(this.start[0]) * 60) + parseInt(this.start[1]))
        var time2 = ((parseInt(this.end[0]) * 60) + parseInt(this.end[1]));
        var time3 = ((time2 - time1) / 60);
        var timeHr = parseInt(""+time3);
        var  timeMin = ((time2 - time1) % 60);
    }
使用

MOMENTJS 的纪元时差

要获得两个纪元时间之间的差异:

语法: moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()

时间差异: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()

分钟差: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()

注意:如果您需要精确的值,可以移除.toFixed()

法典:

const moment = require('moment')
console.log('Date 1',moment(1590597909877).toISOString())
console.log('Date 2',moment(1590597744551).toISOString())
console.log('Date1 - Date 2 time diffrence is : ',moment.duration(moment(moment(1590597909877).diff(moment(1590597744551)))).asMinutes().toFixed()+' minutes')

请参阅此处的工作示例:https://repl.it/repls/MoccasinDearDimension

要获得两时刻格式日期或 javascript 日期格式之间的区别 分钟无差别 最优化的解决方案是

const timeDiff = moment.duration((moment(apptDetails.end_date_time).diff(moment(apptDetails.date_time)))).asMinutes()

您可以根据需要更改差异格式,只需替换 asMinutes() 函数即可

如果您希望两个日期之间的本地化天数(startDateendDate ):

var currentLocaleData = moment.localeData("en");
var duration = moment.duration(endDate.diff(startDate));
var nbDays = Math.floor(duration.asDays()); // complete days
var nbDaysStr = currentLocaleData.relativeTime(returnVal.days, false, "dd", false);

nbDaysStr将包含类似"3 天"的内容;

例如,有关如何显示小时数或月数的信息,请参阅 https://momentjs.com/docs/#/i18n/changing-locale/。

瞬间非常简单下面的代码将返回与当前时间的小时差异:

moment().diff('2021-02-17T14:03:55.811000Z', "h")
const getRemainingTime = (t2) => {
  const t1 = new Date().getTime();
  let ts = (t1-t2.getTime()) / 1000;
  var d = Math.floor(ts / (3600*24));
  var h = Math.floor(ts % (3600*24) / 3600);
  var m = Math.floor(ts % 3600 / 60);
  var s = Math.floor(ts % 60);
  console.log(d, h, m, s)
}