我正在计算两个日期之间的差异,其中有许多不同的例子可用。返回的时间以毫秒为单位,因此我需要将其转换为更有用的内容。
大多数示例都是天:小时:分钟:秒或小时:分钟,但我需要天:小时:分钟所以秒应该向上舍入到分钟。
我正在使用的方法接近但显示3天为2.23.60时应该显示3.00.00因此有些不太正确。由于我刚从网上的一个例子中获取当前代码,我愿意接受其他方法的建议。
我通过从结束日期减去开始日期来获得以毫秒为单位的时间,如下所示: -
date1 = new Date(startDateTime);
date2 = new Date(endDateTime);
ms = Math.abs(date1 - date2)
我基本上需要使用ms变量并将其转入days.hours:minutes。
答案 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)
你走了:
或者如果你不想玩一个正在运行的例子,那么:
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)