瞬间JS持续时间显示错误的时间?

时间:2018-06-28 08:16:14

标签: javascript time momentjs

我正在尝试使用js瞬间以及持续时间和格式的组合将持续时间(秒)转换为对人类友好的输出。 我以秒为单位获取持续时间,然后将其格式化为:

const value = 337650
const duration = (durationSeconds) => {
  const duration = moment.duration(durationSeconds, 'seconds')
  return moment.utc(duration.asMilliseconds()).format('D [days] HH:mm:ss')
}

console.log(`Duration: ${duration(value)}`)

输出

  

“持续时间:4天21:47:30”

JSBin here

我的问题是,这似乎是错误的。 https://www.tools4noobs.com/online_tools/seconds_to_hh_mm_ss/之类的在线服务显示的时间要少一天。 我不确定这些服务正在使用哪个库/算法,以及它们是否显示正确的经过时间或js时刻。 任何想法都非常感谢!

4 个答案:

答案 0 :(得分:1)

您似乎正在将持续时间转换为一个纪元时间,然后对其进行格式化,这是错误的。

请查看此Moment问题,以获取有关持续时间格式的详细信息。 https://github.com/moment/moment/issues/1048

答案 1 :(得分:1)

您可以使用moment-duration-format插件格式化持续时间,以前的方法(从持续时间创建新的绝对日期)将无法正常工作。当您将337650秒添加到Unix Epoch开始时,您会得到1970年1月4日21:47:30,这就是为什么您将这一天视为4。

作为这将如何严重错误的另一个示例,假设我们需要格式化一个持续时间,例如2700000秒。这将为我们提供“ 1天06:00:00”的输出。为什么?因为它等效于1970年2月1日06:00。 (实际结果是31天,06:00:00)。

我认为我们不能责怪moment.js的作者(他们做得非常出色),只是没有在moment.js上使用格式函数,因为应该使用它。

通过使用moment-duration-format中的format函数,我们将格式设置为持续时间而不是绝对时间,并且得到正确的结果!

#include <cstdint>
#include <iostream>

uint32_t cmov(uint8_t pred, uint32_t old_val, uint32_t new_val)
{
    uint32_t result = 0;
    __asm__ __volatile__(
        "mov %2, %0;"
        "test %1, %1;"
        "cmovz %3, %0;"
        : "=r"(result)
        : "r"(pred), "r"(old_val), "r"(new_val)
        : "cc");
    return result;
}

int main()
{
    uint32_t old_val = 1;
    uint32_t new_val = 5;
    for (uint8_t pred = 0; pred < 2; pred++)
    {
        uint32_t result = cmov(pred, old_val, new_val);

        std::cout << "\npred: " << pred
                << "\nold_val: " << old_val << "\nnew_val: " << new_val
                << "\nresult: " << result << std::endl;
    }
    return 0;
}
momentDurationFormatSetup(moment);

const value = 337650
const duration = (durationSeconds) => {
    const duration = moment.duration(durationSeconds, 'seconds')
    return duration.format('D [days] HH:mm:ss');
}

console.log(`Duration: ${duration(value)}`)
document.getElementById('output').innerHTML = `Duration: ${duration(value)}`;

JSFiddle:https://jsfiddle.net/t07ez8o4/9/

答案 2 :(得分:1)

可以使用人性化方法完成简单的格式化:

let value = 337650
let duration = moment.duration(value, 'seconds')
duration = duration.humanize()
console.log(duration)
  

“ 4天”

您可能想了解更复杂的格式:https://github.com/jsmreese/moment-duration-format

答案 3 :(得分:1)

尝试一些简单的事情:

var x = 337650%86400; 
var days = (337650 - x)/86400; 
var y = x%3600; 
var hours= (x-y)/3600; 
var sec = y%60; 
var mins=(y-sec)/60; 
alert(days + ' days ' + hours+':'+mins+':'+sec)