将毫秒转换为分钟和秒?


83

我已经看过以前的问题,但是没有一个我一直在寻找答案。如何将秒表方法中的毫秒转换为分钟和秒?我有:

 watch.start();

启动秒表,

  watch.stop();

停下手表。我后来有

  watch.getTime();

返回毫秒。我希望它在秒和分钟后返回。我该怎么做?我正在寻找一种方法,而不用乘以1000,而不是乘以除法,而是要一种使整个计算更具可读性且更不易出错的方法。


x毫秒= x / 1000秒。然后z秒= z / 60分钟。您可以执行z%60来查找剩余秒数。
2013年

4
基本数学:1000毫秒= 1秒。60秒= 1分钟。
Marc B

1
检查这篇文章:stackoverflow.com/questions/625433/…。应该给你你想要的。
bmac151

1
这实际上是一个非常简单的问题。你尝试了什么?
恢复莫妮卡-notmaynard

Answers:


191

我建议使用TimeUnit。您可以像这样使用它:

long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
long seconds = TimeUnit.MILLISECONDS.toSeconds(millis);

我唯一的问题是我不知道:如何定义Millis(它返回“无法将Millis解析为变量”,并且我不知道如何在System.out.println();方法中访问它。

如果毫秒已经很长,则可以仅使用数字来执行此操作。只需进行简单的计算就无需引入新的库。minutes = ((milliseconds / 1000) / 60)
Kyle Falconer 2013年

2
这似乎到7是对Java 5的最佳答案
肖恩·巴博

7
@Sotti辉煌?这不能解决问题!该问题要求分钟秒,例如秒表的读数。例如,“1 minute 30 seconds答案”提供分钟1 minute 90 seconds
罗勒·布尔克

1
我想使用它,但以秒为单位,而不是整数,例如1.5s。这样有可能吗?
在线


25

tl; dr

Duration d = Duration.ofMillis( … ) ;
int minutes = d.toMinutesPart() ;
int seconds = d.toSecondsPart() ;

Java 9及更高版本

在Java 9及更高版本中,创建一个Duration并调用to…Part方法。在这种情况下:toMinutesParttoSecondsPart

捕获秒表的开始和停止。

Instant start = Instant.now(); 
…
Instant stop = Instant.now();

表示Duration对象中经过的时间。

Duration d = Duration.between( start , stop );

询问每个部分,分钟和秒。

int minutes = d.toMinutesPart();
int seconds = d.toSecondsPart();

您可能还想看看秒表是否运行了预期的时间。

Boolean ranTooLong = ( d.toDaysPart() > 0 ) || ( d.toHoursPart() > 0 ) ;

Java 8

在Java 8中,Duration该类缺少to…Part方法。您需要按照其他答案中所示进行数学运算。

long entireDurationAsSeconds = d.getSeconds();

Duration做数学。

long minutesPart = d.toMinutes(); 
long secondsPart = d.minusMinutes( minutesPart ).getSeconds() ;

请参阅IdeOne.com中的实时代码

间隔:2016-12-18T08:39:34.099Z / 2016-12-18T08:41:49.099Z

d.toString():PT2M15S

d.getSeconds():135

耗用时间:2M 15S

解析度

仅供参考,now在Java 8和Java 9之间更改了方法的分辨率。请参阅此问题

  • Java 9以高达10微秒的分辨率捕获时刻。分辨率取决于计算机硬件的功能。我在装有macOS Sierra的MacBook Pro Retina上看到微秒(十进制的六位数)。
  • Java 8只能捕获毫秒级的瞬间。的实现Clock仅限于毫秒级的分辨率。因此,您可以以纳秒为单位存储值,但只能以毫秒为单位捕获它们。

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

现在处于维护模式Joda-Time项目建议迁移到java.time类。

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要类。java.sql.*

在哪里获取java.time类?

哪个版本的Java或Android使用哪个java.time库的表


对于Android调用,需要api级别
Killer

@Killer对于早期的Android,请参见ThreeTen- BackportThreeTenABP项目。
罗勒·布尔克

12

这只是基础数学。1000毫秒= 1秒,60000毫秒= 1分钟;这样吧

int seconds=(millis/1000)%60;

long minutes=((millis-seconds)/1000)/60;

15
有一个错误-第二行应该是(millis/1000-seconds)/60
Nayuki 2015年

9

我正在为Android创建一个mp3播放器应用,所以我这样做是为了获取当前时间和持续时间

 private String millisecondsToTime(long milliseconds) {
    long minutes = (milliseconds / 1000) / 60;
    long seconds = (milliseconds / 1000) % 60;
    String secondsStr = Long.toString(seconds);
    String secs;
    if (secondsStr.length() >= 2) {
        secs = secondsStr.substring(0, 2);
    } else {
        secs = "0" + secondsStr;
    }

    return minutes + ":" + secs;
}

7

这是完整的程序

import java.util.concurrent.TimeUnit;

public class Milliseconds {

public static void main(String[] args) {
    long milliseconds = 1000000;

    // long minutes = (milliseconds / 1000) / 60;
    long minutes = TimeUnit.MILLISECONDS.toMinutes(milliseconds);

    // long seconds = (milliseconds / 1000);
    long seconds = TimeUnit.MILLISECONDS.toSeconds(milliseconds);

    System.out.format("%d Milliseconds = %d minutes\n", milliseconds, minutes );
    System.out.println("Or");
    System.out.format("%d Milliseconds = %d seconds", milliseconds, seconds );

}
}

我在这里的“链接”中找到了该程序,并对其进行了详细说明。


1
没有解决问题。该问题要求分钟秒钟,作为秒表的读数。您给出了两个单独的结果,以分钟秒为单位。d
Basil Bourque

6

X毫秒= X / 1000秒=(X / 1000)/ 60分钟

如果您有100,000毫秒,请将该值除以1,000,然后剩下100秒。现在100/60 = 1.666〜分钟,但小数分钟无值,因此:用100%60 = 40秒来找到余数,然后将整数除以100/60 = 1分钟,并余下40秒。答:1分40秒。


5

要将以毫秒为单位的时间直接转换为分钟:您可以使用第二种格式

String durationText = DateUtils.formatElapsedTime(timeInMillis / 1000));

这将以正确的格式返回带有时间的字符串。它为我工作。


啊,好人!我只是在一个毫秒级的计时器上测试过,就可以了!
esQmo_

5

要获得手表上显示的实际时,分和秒,请尝试以下代码

val sec = (milliSec/1000) % 60
val min = ((milliSec/1000) / 60) % 60
val hour = ((milliSec/1000) / 60) / 60

5

您可以尝试以这种方式进行:

从传递ms值

Long ms = watch.getTime();

getDisplayValue(ms)

Kotlin的实现:

fun getDisplayValue(ms: Long): String {
        val duration = Duration.ofMillis(ms)
        val minutes = duration.toMinutes()
        val seconds = duration.minusMinutes(minutes).seconds

        return "${minutes}min ${seconds}sec"
}

Java实现:

public String getDisplayValue(Long ms) {
        Duration duration = Duration.ofMillis(ms);
        Long minutes = duration.toMinutes();
        Long seconds = duration.minusMinutes(minutes).getSeconds();

        return minutes + "min " + seconds "sec"
}

5
  public static String getIntervalTime(long longInterval) {

    long intMillis = longInterval;
    long dd = TimeUnit.MILLISECONDS.toDays(intMillis);
    long daysMillis = TimeUnit.DAYS.toMillis(dd);
    intMillis -= daysMillis;
    long hh = TimeUnit.MILLISECONDS.toHours(intMillis);
    long hoursMillis = TimeUnit.HOURS.toMillis(hh);
    intMillis -= hoursMillis;
    long mm = TimeUnit.MILLISECONDS.toMinutes(intMillis);
    long minutesMillis = TimeUnit.MINUTES.toMillis(mm);
    intMillis -= minutesMillis;
    long ss = TimeUnit.MILLISECONDS.toSeconds(intMillis);
    long secondsMillis = TimeUnit.SECONDS.toMillis(ss);
    intMillis -= secondsMillis;

    String stringInterval = "%02d days - %02d:%02d:%02d.%03d";
    return String.format(stringInterval , dd, hh, mm, ss, intMillis);
  }

测验

long delay = 1000*60*20 + 1000*5 + 10;
LOGGER.log(Level.INFO, "Delay Expected {0}", getIntervalTime(delay));

输出量

INFO: Delay Expected 00 days - 00:20:05.010

3

我不认为Java 1.5支持并发TimeUnit。否则,我建议使用TimeUnit。以下基于纯数学方法。

stopWatch.stop();
long milliseconds = stopWatch.getTime();

int seconds = (int) ((milliseconds / 1000) % 60);
int minutes = (int) ((milliseconds / 1000) / 60);

1

您可以轻松地将毫秒转换为秒,分钟和小时。

                val millis = **milliSecondsYouWantToConvert**
                val seconds = (millis / 1000) % 60
                val minutes = ((millis / 1000) / 60) % 60
                val hours = ((millis / 1000) / 60) / 60

                println("--------------------------------------------------------------------")
                println(String.format("%02dh : %02dm : %02ds remaining", hours, minutes, seconds))
                println("--------------------------------------------------------------------")
**RESULT :** 
--------------------------------------------------------------------
  01h : 23m : 37s remaining
--------------------------------------------------------------------


1

下面的代码完成了将ms转换为[m:ss]格式的min:secs的工作

int seconds;
int minutes;
String Sec;
long Mills = ...;  // Milliseconds goes here
minutes = (int)(Mills / 1000)  / 60;
seconds = (int)((Mills / 1000) % 60);
Sec = seconds+"";

TextView.setText(minutes+":"+Sec);//Display duration [3:40]

0
package com.v3mobi.userpersistdatetime;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;

import java.util.Date;
import java.util.concurrent.TimeUnit;

public class UserActivity extends AppCompatActivity {

    Date startDate;
    Date endDate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user);
        startDate = java.util.Calendar.getInstance().getTime(); //set your start time
    }

    @Override
    protected void onStop() {
        super.onStop();
        endDate = java.util.Calendar.getInstance().getTime(); // set  your end time

        chekUserPersistence();

    }

    private void chekUserPersistence()
    {
        long duration = endDate.getTime() - startDate.getTime();
//        long duration = 301000;

        long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);         // minutes ok
        long secs = (duration/1000) % 60;         // minutes ok


        Toast.makeText(UserActivity.this, "Diff  "
                +  diffInMinutes + " : "+ secs , Toast.LENGTH_SHORT).show();

        System.out.println("Diff  " + diffInMinutes +" : "+ secs );

        Log.e("keshav","diffInMinutes -->" +diffInMinutes);
        Log.e("keshav","secs -->" +secs);
        finish();
    }
}

-2

这是一个简单的解决方案。可以在任何方法中使用的示例调用:

  • StopWatch.start();
  • StopWatch.stop();
  • StopWatch.displayDiff();显示开始和停止之间以分钟和秒为单位的差异。(经过的时间)

    import java.time.Duration;
    import java.time.Instant;
    
    
    public class StopWatch {
    
        private static Instant start;
        private static Instant stop;
    
        private void StopWatch() {
            // not called
        }
    
        public static void start() {
            start = Instant.now();
        }
    
        public static void stop() {
            stop = Instant.now();
        }
    
        public static void displayDiff() {
            Duration totalTime = Duration.between(start, stop);
            System.out.println(totalTime.toMinutes() + " Minutes " 
                               + totalTime.toMillis() / 1000 + " Seconds");
        }
    }
    

1
不正确 该toMillis方法报告整个持续时间(以毫秒为单位)。
罗勒·布尔克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.