Javascript将毫秒显示为天:小时:没有秒的分钟

时间:2011-12-16 00:19:58

标签: javascript datetime

我正在计算两个日期之间的差异,其中有许多不同的例子可用。返回的时间以毫秒为单位,因此我需要将其转换为更有用的内容。

大多数示例都是天:小时:分钟:秒或小时:分钟,但我需要天:小时:分钟所以秒应该向上舍入到分钟。

我正在使用的方法接近但显示3天为2.23.60时应该显示3.00.00因此有些不太正确。由于我刚从网上的一个例子中获取当前代码,我愿意接受其他方法的建议。

我通过从结束日期减去开始日期来获得以毫秒为单位的时间,如下所示: -

date1 = new Date(startDateTime);
date2 = new Date(endDateTime);
ms = Math.abs(date1 - date2)

我基本上需要使用ms变量并将其转入days.hours:minutes。

12 个答案:

答案 0 :(得分:22)

这样的东西?

function dhm(t){
    var cd = 24 * 60 * 60 * 1000,
        ch = 60 * 60 * 1000,
        d = Math.floor(t / cd),
        h = Math.floor( (t - d * cd) / ch),
        m = Math.round( (t - d * cd - h * ch) / 60000),
        pad = function(n){ return n < 10 ? '0' + n : n; };
  if( m === 60 ){
    h++;
    m = 0;
  }
  if( h === 24 ){
    d++;
    h = 0;
  }
  return [d, pad(h), pad(m)].join(':');
}

console.log( dhm( 3 * 24 * 60 * 60 * 1000 ) );

答案 1 :(得分:14)

听起来像是Moment.js的工作。

var diff = new moment.duration(ms);
diff.asDays();     // # of days in the duration
diff.asHours();    // # of hours in the duration
diff.asMinutes();  // # of minutes in the duration

在MomentJS中有很多其他格式化持续时间的方法。 docs非常全面。

答案 2 :(得分:9)

不知道为什么,但其他人并没有为我工作,所以这里是我的

function dhm(ms){
    days = Math.floor(ms / (24*60*60*1000));
    daysms=ms % (24*60*60*1000);
    hours = Math.floor((daysms)/(60*60*1000));
    hoursms=ms % (60*60*1000);
    minutes = Math.floor((hoursms)/(60*1000));
    minutesms=ms % (60*1000);
    sec = Math.floor((minutesms)/(1000));
    return days+":"+hours+":"+minutes+":"+sec;
}

alert(dhm(500000));

答案 3 :(得分:3)

你走了:

http://jsfiddle.net/uNnfH/1

或者如果你不想玩一个正在运行的例子,那么:

window.minutesPerDay = 60 * 24;

function pad(number) {
    var result = "" + number;
    if (result.length < 2) {
        result = "0" + result;
    }

    return result;
}

function millisToDaysHoursMinutes(millis) {
    var seconds = millis / 1000;
    var totalMinutes = seconds / 60;

    var days = totalMinutes / minutesPerDay;
    totalMinutes -= minutesPerDay * days;
    var hours = totalMinutes / 60;
    totalMinutes -= hours * 60; 

    return days + "." + pad(hours) + "." + pad(totalMinutes);
}

答案 4 :(得分:2)

Dunno你需要多少答案,但这是另一个答案 - 只是另外几个已经给出的答案:

function msToDHM(v) {
  var days = v / 8.64e7 | 0;
  var hrs  = (v % 8.64e7)/ 3.6e6 | 0;
  var mins = Math.round((v % 3.6e6) / 6e4);

  return days + ':' + z(hrs) + ':' + z(mins);

  function z(n){return (n<10?'0':'')+n;}
}

请注意这些计算,跨越夏令时边界的时段会导致问题。总是更好地在UTC工作并转换到当地时间进行演示。

答案 5 :(得分:1)

“返回的时间以毫秒为单位,因此我需要将其转换为更有用的内容。”

您是从服务器获取时间还是纯粹的javascript?

有些代码会真正帮助。 “有用的东西”有点模糊。

以下是一个例子,我认为这就是你所说的。

<script type="text/javascript">

//Set the two dates
var millennium =new Date(2000, 0, 1) //Month is 0-11 in JavaScript
today=new Date()
//Get 1 day in milliseconds
var one_day=1000*60*60*24

//Calculate difference btw the two dates, and convert to days
document.write(Math.ceil((today.getTime()-millennium.getTime())/(one_day))+
" days has gone by since the millennium!")

</script>
4367 days has gone by since the millennium!

答案 6 :(得分:0)

如果没有代码,很难确切地知道你有哪些错误,但我怀疑你的确如你所说的那样:四舍五入。如果向下舍入对你来说不够好,这里是如何舍入到最接近的:

var time = date.getTime();
if (time % 60000 >= 30000) time += 60000;

然后继续计算。

答案 7 :(得分:0)

用moment.js试试这个:

function getFormattedMs(ms) {
  var duration = moment.duration(ms);
  return moment.utc(duration.asMilliseconds()).format("mm:ss");
}

当您想要显示小时数时,您必须有一个解决方法:

function formatDuration(ms) {
  var duration = moment.duration(ms);
  return Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss");
}

此时的解决方法已在此Issue中引入。

答案 8 :(得分:0)

改编自padStart()。对我来说似乎更清楚了。

function convertMS(ms) {
  var d, h, m, s;
  s = Math.floor(ms / 1000);
  m = Math.floor(s / 60);
  s = s % 60;
  h = Math.floor(m / 60);
  m = m % 60;
  d = Math.floor(h / 24);
  h = h % 24;

  var pad = function (n) { return n < 10 ? '0' + n : n; };

  var result = d + '.' + pad(h) + ':' + pad(m);
  return result;
};

答案 9 :(得分:0)

这是我用moment.js在React中的解决方案

https://codesandbox.io/s/milliseconds-to-human-readable-text-with-momentjs-in-react-0pgmq

import React from "react";
import ReactDOM from "react-dom";
import moment from "moment";

import "../styles.css";

function App() {
  const oneSecondInMillis = 1000;
  const oneMinuteInMillis = 60000;
  const oneHourInMillis = 3.6e6;
  const oneDayInMillis = 8.64e7;
  const oneMonthMillis = 2.628e9;
  const oneYearInMillis = 3.154e10; //3.154e10;

  const createTime = millis => new moment.duration(millis);

  const millisToReadable = millis => {
    let result = "";

    if (typeof millis !== "number") return "0 ms";

    let time = createTime(millis);

    let years = Math.floor(time.asYears());
    millis = millis - years * oneYearInMillis;
    time = createTime(millis);

    let months = Math.floor(time.asMonths());
    millis = millis - months * oneMonthMillis;
    time = createTime(millis);

    let days = Math.floor(time.asDays());
    millis = millis - days * oneDayInMillis;
    time = createTime(millis);

    let hours = Math.floor(time.asHours());
    millis = millis - hours * oneHourInMillis;
    time = createTime(millis);

    let minutes = Math.floor(time.asMinutes());
    millis = millis - minutes * oneMinuteInMillis;
    time = createTime(millis);

    let seconds = Math.floor(time.asSeconds());
    millis = millis - seconds * oneSecondInMillis;
    time = new moment.duration(millis);

    let milliseconds = Math.floor(time.asMilliseconds());

    if (years > 0) {
      result += ` ${years} y`;
    }
    if (years > 0 || months > 0) {
      result += ` ${months} m`;
    }
    if (years > 0 || months > 0 || days > 0) {
      result += ` ${days} d`;
    }
    if (years > 0 || months > 0 || days > 0 || hours > 0) {
      result += ` ${hours} h`;
    }
    if (years > 0 || months > 0 || days > 0 || hours > 0 || minutes > 0) {
      result += ` ${minutes} m`;
    }
    if (
      years > 0 ||
      months > 0 ||
      days > 0 ||
      hours > 0 ||
      minutes > 0 ||
      seconds > 0
    ) {
      result += ` ${seconds} s`;
    }
    result += ` ${milliseconds} ms`;

    return result;
  };

  const millis =
    2 * oneYearInMillis +
    7 * oneMonthMillis +
    20 * oneDayInMillis +
    10 * oneHourInMillis +
    8 * oneMinuteInMillis +
    50 * oneSecondInMillis +
    95;

  const result = millisToReadable(millis);

  return (
    <div className="App">
      <h1>Milliseconds to Human Readable Text</h1>
      <h2>{millis}</h2>
      <h2>{result}</h2>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

答案 10 :(得分:0)

要使用附加功能formatDuration扩展“ moment.js”以正确设置间隔格式,请添加以下脚本:

this.moment.formatDuration = function (duration, timeFormat) {
    const ms = duration.asMilliseconds(),
        days = Math.floor(Math.abs(ms) / 8.64e7),
        msOnLastDay = Math.abs(ms) - days * 8.64e7;
    return (ms < 0 ? '-' : '') + (days !== 0 ? days + ' ' : '')
        + moment.utc(msOnLastDay).format(timeFormat ? timeFormat : 'HH:mm:ss.SSS');
};

像10秒钟将显示为“ 00:00:10.000”。两天一小时25分钟之间的差异将显示为“ 2 01:25:00.000”。时间格式可以自定义。

请参阅JSFiddle中正在运行的示例-https://jsfiddle.net/aldis/9x3f8b7q

答案 11 :(得分:0)

这个库对于解析毫秒似乎相当有用。它为您提供了一个具有天、小时、分钟等属性的对象...

https://www.npmjs.com/package/parse-ms

这个打印的毫秒数非常漂亮:

https://github.com/sindresorhus/pretty-ms

相关问题