如何将毫秒转换为人类可读形式?

125

我需要将任意毫秒数转换为天、小时、分钟和秒。

例如:10天,5小时,13分钟,1秒。


我正在使用的编程语言没有内置此功能,否则我会使用它。我觉得很难理解。是哪种编程语言?是哪个操作系统? - S.Lott
ActionScript在任何操作系统上都有着糟糕的日期/时间支持。 - FlySwat
3
我不知道有任何一种语言能够满足他的要求,也没有任何理由需要这样做。使用一些非常简单的除法/取模数学运算可以很好地得出答案。 - Kip
1
并非所有年份的天数都相同,因此您需要说明是哪个时期。或者,您只想使用“标准”的年份(365.x天)? - Milan Babuškov
@Kip:明白了——我误读了问题——一直在想毫秒级的操作系统时间戳。不是增量时间或间隔时间。很想编辑一下这个问题…… - S.Lott
这是我的做法...例如,你有86400000,所以在Windows计算器中(我正在使用Windows计算器,使用适当的语法可以实现相同的Unix计算器) 输入86400000/1000(得到秒),然后再除以60(得到分钟),再除以60(得到小时),等等...我知道这不是你想要的...但有时人们需要快速获得简单粗暴的答案...就像我曾经试图调试一些值...它很有帮助而且快捷... :-) - user10398
22个回答

234

好的,既然没有其他人站出来,我就编写简单的代码来完成这个任务:

x = ms / 1000
seconds = x % 60
x /= 60
minutes = x % 60
x /= 60
hours = x % 24
x /= 24
days = x

我很高兴你只问了天数而没有问月数。:)

注意,在上面的代码中,假设/表示截断整数除法。如果您在一种使用/表示浮点除法的语言中使用此代码,则需要根据需要手动截断除法的结果。


2
刚在闪存函数中使用了那个。谢谢!(因简单而点赞) - Makram Saleh
2
它不能正常工作。在使用除数时应该使用parseInt,否则会看到很长的浮点值。请参见下面我的答案,以获得更全面的解决方案。 - Rajiv
20
我很高兴你只问到天数而没有问到月份。 :) 哈哈 :) - moshfiqur

60

设A为毫秒数,则有:

seconds=(A/1000)%60
minutes=(A/(1000*60))%60
hours=(A/(1000*60*60))%24

等等,(% 是求模运算符)。

希望这有所帮助。


@sabbibJAVA 24 应该可以工作。你用的是什么编程语言?如果“/”执行浮点数除法,那么你需要截断值。其他答案中默认“/”执行整数除法。 - Brian J

28

以下两种解决方案都使用了JavaScript(我之前不知道这个解决方案是与编程语言无关的!)。如果需要捕获时间跨度> 1个月,则两种解决方案都需要扩展。

解决方案1:使用Date对象

var date = new Date(536643021);
var str = '';
str += date.getUTCDate()-1 + " days, ";
str += date.getUTCHours() + " hours, ";
str += date.getUTCMinutes() + " minutes, ";
str += date.getUTCSeconds() + " seconds, ";
str += date.getUTCMilliseconds() + " millis";
console.log(str);

结果为:

"6 days, 5 hours, 4 minutes, 3 seconds, 21 millis"

虽然库非常有用,但是为什么要用库呢?不如重新发明轮子! :)

解决方案2:编写自己的解析器

var getDuration = function(millis){
    var dur = {};
    var units = [
        {label:"millis",    mod:1000},
        {label:"seconds",   mod:60},
        {label:"minutes",   mod:60},
        {label:"hours",     mod:24},
        {label:"days",      mod:31}
    ];
    // calculate the individual unit values...
    units.forEach(function(u){
        millis = (millis - (dur[u.label] = (millis % u.mod))) / u.mod;
    });
    // convert object to a string representation...
    var nonZero = function(u){ return dur[u.label]; };
    dur.toString = function(){
        return units
            .reverse()
            .filter(nonZero)
            .map(function(u){
                return dur[u.label] + " " + (dur[u.label]==1?u.label.slice(0,-1):u.label);
            })
            .join(', ');
    };
    return dur;
};
创建一个“duration”对象,其中包括您所需的任何字段。 格式化时间戳变得简单起来...
console.log(getDuration(536643021).toString());

输出结果:

"6 days, 5 hours, 4 minutes, 3 seconds, 21 millis"

将该行代码更改为获取单数和复数 return dur[u.label] + " " + (dur[u.label]==1?u.label.slice(0,-1):u.label); - Phillip Kamikaze
1
@PhillipKamikaze 谢谢你,Phillip!我已经采纳了你的建议。 - Nick Grealy
您可能不想显示零值的部分,因此可以添加以下过滤器...`var nonZero = function(u){ return !u.startsWith("0"); };// 将对象转换为字符串表示形式... dur.toString = function(){ return units.reverse().map(function(u){ return dur[u.label] + " " + (dur[u.label]==1?u.label.slice(0,-1):u.label); }).filter(nonZero).join(', '); };` - Ruslan Ulanov
1
谢谢@RuslanUlanov!我已将其添加到示例中(尽管稍作修改以检查数字是否为“真实值”)。 - Nick Grealy

23

1
谢谢!当它在我已经拥有的库中时,我就会感到很高兴… - Landon Kuhn
这是专业的答案! - J Steven Perry

8
你应该使用你所使用的语言的日期时间函数,但是,仅作为娱乐,这里是代码:
int milliseconds = someNumber;

int seconds = milliseconds / 1000;

int minutes = seconds / 60;

seconds %= 60;

int hours = minutes / 60;

minutes %= 60;

int days = hours / 24;

hours %= 24;

4
在Java中,
public static String formatMs(long millis) {
    long hours = TimeUnit.MILLISECONDS.toHours(millis);
    long mins = TimeUnit.MILLISECONDS.toMinutes(millis);
    long secs = TimeUnit.MILLISECONDS.toSeconds(millis);
    return String.format("%dh %d min, %d sec",
            hours,
            mins - TimeUnit.HOURS.toMinutes(hours),
            secs - TimeUnit.MINUTES.toSeconds(mins)
    );
}

类似于这样的东西:
12h 1 min, 34 sec

4
function convertTime(time) {        
    var millis= time % 1000;
    time = parseInt(time/1000);
    var seconds = time % 60;
    time = parseInt(time/60);
    var minutes = time % 60;
    time = parseInt(time/60);
    var hours = time % 24;
    var out = "";
    if(hours && hours > 0) out += hours + " " + ((hours == 1)?"hr":"hrs") + " ";
    if(minutes && minutes > 0) out += minutes + " " + ((minutes == 1)?"min":"mins") + " ";
    if(seconds && seconds > 0) out += seconds + " " + ((seconds == 1)?"sec":"secs") + " ";
    if(millis&& millis> 0) out += millis+ " " + ((millis== 1)?"msec":"msecs") + " ";
    return out.trim();
}

4

这是我编写的一个方法。它接受一个整数毫秒值并返回一个可读性好的字符串

public String convertMS(int ms) {
    int seconds = (int) ((ms / 1000) % 60);
    int minutes = (int) (((ms / 1000) / 60) % 60);
    int hours = (int) ((((ms / 1000) / 60) / 60) % 24);

    String sec, min, hrs;
    if(seconds<10)  sec="0"+seconds;
    else            sec= ""+seconds;
    if(minutes<10)  min="0"+minutes;
    else            min= ""+minutes;
    if(hours<10)    hrs="0"+hours;
    else            hrs= ""+hours;

    if(hours == 0)  return min+":"+sec;
    else    return hrs+":"+min+":"+sec;

}

2
Long serverUptimeSeconds = 
    (System.currentTimeMillis() - SINCE_TIME_IN_MILLISECONDS) / 1000;


String serverUptimeText = 
String.format("%d days %d hours %d minutes %d seconds",
serverUptimeSeconds / 86400,
( serverUptimeSeconds % 86400) / 3600 ,
((serverUptimeSeconds % 86400) % 3600 ) / 60,
((serverUptimeSeconds % 86400) % 3600 ) % 60
);

2
为什么不这样做呢:
var ms = 86400;
var seconds = ms / 1000; // 86.4
var minutes = seconds / 60; // 1.44
var hours = minutes / 60; // 0.024
var days = hours / 24; // 0.001
对于浮点数精度问题,可以处理,例如:Number(minutes.toFixed(5)) // 1.44

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接