Преобразование миллисекунд в минуты и секунды?


83

Я просмотрел предыдущие вопросы, но ни на один не нашел ответа, который я искал. Как преобразовать миллисекунды из метода StopWatch в минуты и секунды? Я имею:

 watch.start();

запустить секундомер и

  watch.stop();

чтобы остановить часы. Позже я

  watch.getTime();

который возвращает миллисекунды. Я хочу вернуть его через секунды и минуты. Как мне это сделать? Я ищу способ сделать это без умножения / деления на 1000, а скорее метод, который сделает все вычисления более читаемыми и менее подверженными ошибкам.


x миллисекунд = x / 1000 секунд. Тогда z секунд = z / 60 минут. Вы можете сделать z% 60, чтобы узнать количество оставшихся секунд.
Кон

4
основная математика: 1000 миллисекунд = 1 секунда. 60 секунд = 1 минута.
Marc B

1
Проверьте это сообщение: stackoverflow.com/questions/625433/… . Должен получить то, что вы хотите.
bmac151

1
На самом деле это действительно простой вопрос. Что пробовали?
Reinstate Monica - notmaynard

Вы можете сделать вот так readyandroid.wordpress.com/…
Готовый Android

Ответы:


192

Я бы предложил использовать TimeUnit. Вы можете использовать это так:

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

Моя единственная проблема в том, что я не знаю: как определить миллис (он возвращается как «миллис не может быть разрешен в переменную», и я не знаю, как получить к нему доступ в методе System.out.println ();.

Вы можете сделать это, используя только числа, если миллисекунды уже являются долгими. Нет необходимости вводить новую библиотеку только для выполнения простых вычислений. minutes = ((milliseconds / 1000) / 60)
Кайл Фалконер

2
Кажется, это лучший ответ для Java с 5 по 7.
Шон Барбо

7
@ Сотти Блестящий? Это не касается вопроса! Вопрос запрашивает минуты и секунды, как показания секундомера, например, 1 minute 30 secondsЭтот ответ дает , например, минуты или секунды 1 minute 90 seconds.
Basil

1
Я хотел бы использовать его, но с секундами как двойными, а не с целыми числами, например 1,5 с. Возможно ли это когда-нибудь?
Line

49

После преобразования миллисекунд в секунды (делением на 1000) вы можете использовать / 60для получения значения минут и % 60(остаток) для получения значения «секунд в минуте».

long millis = .....;  // obtained from StopWatch
long minutes = (millis / 1000)  / 60;
int seconds = (int)((millis / 1000) % 60);

Вы можете сделать вот так readyandroid.wordpress.com/…
Готовый Android

25

tl; dr

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

Java 9 и новее

В Java 9 и более поздних версиях создайте Durationи вызовите to…Partметоды. В этом случае: toMinutesPartи toSecondsPart.

Захватите начало и остановку секундомера.

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

разрешение

FYI, разрешение nowметодов изменилось между Java 8 и Java 9. См. Этот вопрос .

  • Java 9 улавливает момент с разрешением до наносекунд. Разрешение зависит от возможностей оборудования вашего компьютера. Я вижу микросекунды (шесть цифр десятичной дроби) на MacBook Pro Retina с macOS Sierra.
  • Java 8 улавливает момент только с точностью до миллисекунд. Реализация Clockограничена разрешением в миллисекунды. Таким образом, вы можете хранить значения в наносекундах, но фиксировать их только за миллисекунды.

О java.time

Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date, Calendar, и SimpleDateFormat.

Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .

Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .

Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*занятиях.

Где взять классы java.time?

Таблица того, какая библиотека java.time использовать с какой версией Java или Android


для вызова Android требуется уровень API 26.
Killer

@Killer Для более ранних версий Android см. Проекты ThreeTen- Backport и ThreeTenABP .
Basil

12

Это просто математика. 1000 миллисекунд = 1 секунда и 60000 миллисекунд = 1 минута; Так что просто сделай,

int seconds=(millis/1000)%60;

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

16
Ошибка - вторая строчка должна быть(millis/1000-seconds)/60
Наюки

10

Я создавал приложение для mp3-плеера для Android, поэтому я сделал это так, чтобы получить текущее время и продолжительность

 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
Это не решает Вопрос . Вопрос запрашивает минуты и секунды, как показания секундомера. Вы даете два отдельных результата, минуты или секунды.
Бэзил Бурк

6

X миллисекунд = X / 1000 секунд = (X / 1000) / 60 минут

Если у вас есть 100 000 миллисекунд, разделите это значение на 1000, и у вас останется 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

Код ниже выполняет работу по преобразованию мс в мин: сек в формате [m: ss].

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Метод сообщает всю длительность как миллисекунды.
Basil Bourque
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.