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