Ответ 1
Я бы предложил использовать TimeUnit
. Вы можете использовать его следующим образом:
long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
long seconds = TimeUnit.MILLISECONDS.toSeconds(millis);
Я просмотрел предыдущие вопросы, но ни один из них не получил ответа, который я искал. Как преобразовать миллисекунды из метода StopWatch в минуты и секунды? У меня есть:
watch.start();
чтобы запустить секундомер и
watch.stop();
чтобы остановить часы. Я позже
watch.getTime();
который возвращает миллисекунды. Я хочу, чтобы он вернулся в секундах и минутах. Как мне это сделать? Я ищу способ сделать это без умножения/деления на 1000, а скорее на метод, который сделает все вычисления более читабельными и менее подверженными ошибкам.
Я бы предложил использовать TimeUnit
. Вы можете использовать его следующим образом:
long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
long seconds = TimeUnit.MILLISECONDS.toSeconds(millis);
После преобразования миллисекунд в секунды (путем деления на 1000) вы можете использовать /60
чтобы получить значение минут, и % 60
(остаток), чтобы получить значение "секунды в минутах".
long millis = .....; // obtained from StopWatch
long minutes = (millis / 1000) / 60;
int seconds = (int)((millis / 1000) % 60);
Duration d = Duration.ofMillis( … ) ;
int minutes = d.toMinutesPart() ;
int seconds = d.toSecondsPart() ;
В 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 классу Duration
не хватает методов to…Part
. Вам нужно будет сделать математику, как показано в других ответах.
long entireDurationAsSeconds = d.getSeconds();
Или пусть Duration
выполнит математику.
long minutesPart = d.toMinutes();
long secondsPart = d.minusMinutes( minutesPart ).getSeconds() ;
Смотрите живой код на IdeOne.com.
Interval: 2016-12-18T08:39:34.099Z/2016-12-18T08:41:49.099Z
d.toString(): PT2M15S
d.getSeconds(): 135
Elapsed: 2M 15S
К вашему сведению, разрешение методов now
изменено между Java 8 и Java 9. См. этот вопрос.
Clock
ограничена разрешением в миллисекундах. Таким образом, вы можете хранить значения в наносекундах, но записывать их только в миллисекундах.Это просто базовая математика. 1000 миллисекунд = 1 секунда и 60000 миллисекунд = 1 минута; Так что просто,
int seconds=(millis/1000)%60;
long minutes=((millis-seconds)/1000)/60;
Вот полная программа
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 );
}
}
Я нашел эту программу здесь " Ссылка ", там это подробно объясняется.
Я создавал приложение для 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;
}
Чтобы узнать действительные часы, минуты и секунды, как показано на часах, попробуйте этот код
val sec = (milliSec/1000) % 60
val min = ((milliSec/1000) / 60) % 60
val hour = ((milliSec/1000) / 60) / 60
X миллисекунд = X/1000 секунд = (X/1000)/60 минут
Если у вас есть 100 000 миллисекунд, разделите это значение на 1000, и вы останетесь на 100 секунд. Теперь 100/60 = 1.666 ~ минут, но дробные минуты не имеют значения, поэтому: выполните 100% 60 = 40 секунд, чтобы найти остаток, затем целочисленное деление 100/60 = 1 минута с остатком 40 секунд. Ответ: 1 минута, 40 секунд.
Я не думаю, что Java 1.5 поддерживает параллельный TimeUnit. В противном случае, я бы предложил для TimeUnit. Ниже приведено чисто математическое обоснование.
stopWatch.stop();
long milliseconds = stopWatch.getTime();
int seconds = (int) ((milliseconds / 1000) % 60);
int minutes = (int) ((milliseconds / 1000) / 60);
Для перевода времени в миллисекундах непосредственно в минуты: второй формат вы можете использовать это
String durationText = DateUtils.formatElapsedTime(timeInMillis / 1000));
Это вернет строку со временем в правильном форматировании. Это сработало для меня.
Вы можете попробовать действовать следующим образом:
Передать значение мс от
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"
}
Вот простое решение. Примеры вызовов, которые могут быть использованы любым способом:
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");
}
}
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();
}
}
Вы можете легко конвертировать милисекунды в секунды, минуты и часы.
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
--------------------------------------------------------------------