【问题标题】:momentjs get time differencemomentjs 获取时差
【发布时间】:2020-10-02 03:11:57
【问题描述】:

我正在尝试使用 moment.js 获取用户在页面中花费的时间,但它返回了错误的值。

代码:

dateStart: any;

ngOnInit() {
  this.dateStart = moment(); // current time
}

// when user post data before being redirect
moment(moment(this.dateStart).diff(moment())).format("hh:mm:ss");

上面的代码应该返回例如00:00:04,这意味着用户在此页面中为4 seconds。但我得到了这样的东西06:59:55

有什么想法吗?

【问题讨论】:

  • 我怀疑您正在格式化 1970 年 1 月 1 日 4 秒后的日期,并针对您的时区偏移进行了调整。您正在寻找一个间隔,而不是一个日期。
  • @rayhatfield 你觉得我应该怎么做?

标签: javascript angular momentjs


【解决方案1】:

如果你只想要秒数(diff),为什么不使用带有测量参数的momentjs的diff函数(支持的是yearsmonthsweeksdayshoursminutesseconds 默认为毫秒。)

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

let dateStart = moment([2020, 9, 2, 12, 0, 0, 125]);


let futureTime = moment(); 

let secondsAgo = (futureTime.diff(dateStart, 'seconds') % 60);
let minutesAgo = (futureTime.diff(dateStart, 'minutes') % 60);
let hoursAgo = futureTime.diff(dateStart, 'hours');
console.log('hour: ' + hoursAgo + ', minute: ' + minutesAgo + ', seconds: ' + secondsAgo)
let hms = moment({
  hour: hoursAgo,
  minute: minutesAgo,
  seconds: secondsAgo
});
console.log(hms.format('HH:mm:ss'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.0/moment.min.js"></script>

【讨论】:

  • 我不只是想要秒,我想要小时、分钟和秒
  • 我已更新代码以显示 HH:mm:ss 格式的差异
【解决方案2】:

我怀疑您正在格式化 1970 年 1 月 1 日 4 秒后的日期,并根据您的时区偏移进行了调整。您正在寻找duration,而不是日期。

为什么要格式化它?为什么不只记录原始持续时间?你不需要时刻减去一个时间戳 从另一个。 Date.now() 将为您获取当前时间戳:

this.startDate = Date.now();

// ...a few moments later...

const duration = Date.now() - this.startDate; // number of ms between then and now

【讨论】:

  • 1 如果我使用moment.duration(this.dateStart) 它会给我PT444891H22M42.093S 2 Why not just record the raw duration? 请告诉我怎么做?我对所有解决方案持开放态度,只要它们能满足我的需求
  • 返回3848 idk 这意味着什么:D
  • 这意味着开始和结束之间有 3848 毫秒,或 3.848 秒。
  • 当然。除以 1000 得到秒,将秒除以 60 得到分钟,等等,或者使用执行此操作的许多现有软件包之一,例如 hh-mm-ss
  • 无法做到:/
【解决方案3】:

您可以先尝试转换为 UTC。

moment.utc(moment().diff(this.dateStart)).format("HH:mm:ss.SSS"); //include milliseconds

let start = moment();

setTimeout(() => {
  const duration = moment.utc(moment().diff(start));
  console.log(duration.format("HH:mm:ss.SSS"));
}, 1500);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.0/moment.min.js"></script>

【讨论】:

  • 如何从utc更改时区?
  • 看一下我刚才给你的代码,对你的代码略有改动
  • 我希望您的方法干净,代码要求最低,但我真的不想使用 utc() 有什么方法可以告诉我如何使用我的本地而不是 utc ?
  • 好吧,你用什么都没关系。您指的不是语言环境时间,您只需要以可读的形式显示它。
【解决方案4】:

plotly.js 中没有将差异作为新的 plotly 对象返回的函数。我认为这样做的唯一方法是以秒为单位获取时差,然后计算分钟和小时。

以下应该有效。它将时差返回为String。所以秒和分钟总是在 0 到 60 之间,小时大于 0。74:12:40 的结果意味着用户在该页面上停留了 74 小时 12 分 40 秒。

function runTest() {
    let startDate = moment('02.10.2020 8:00:00', 'DD.MM.YYYY HH:mm:ss');
    let endDate = moment('03.10.2020 10:24:38', 'DD.MM.YYYY HH:mm:ss');
    getDifferenceTime(startDate, endDate);
}


function getDifferenceTime(startDate, endDate) {
    // Get time difference in seconds
    let seconds = endDate.diff(startDate, 'seconds');
    let minutes = 0;
    let hours = 0;
    // Calculate number of minutes
    if (seconds >= 60) {
        minutes = Math.floor(seconds / 60);
        seconds -= minutes * 60;
    }
    // Calculate number of hours
    if (minutes >= 60) {
        hours = Math.floor(minutes / 60);
        minutes -= hours * 60;
    }
    let timeString = hours + ':' + minutes + ':' + seconds;
    console.log(timeString);
    return timeString;
}

您可以使用上面的代码对其进行测试。它应该返回26:24:38,这是您的预期输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2015-01-08
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多