Zamiana milisekund na minuty i sekundy?


83

Przejrzałem poprzednie pytania, ale żadne z nich nie miało odpowiedzi, której szukałem. Jak przekonwertować milisekundy z metody StopWatch na minuty i sekundy? Mam:

 watch.start();

aby uruchomić stoper i

  watch.stop();

zatrzymać zegarek. Później to zrobiłem

  watch.getTime();

która zwraca milisekundy. Chcę, żeby wróciło za kilka sekund i minut. Jak mam to zrobić? Szukam sposobu na zrobienie tego bez mnożenia / dzielenia przez 1000, ale raczej metody, która sprawi, że całe obliczenia będą bardziej czytelne i mniej podatne na błędy.


x milisekund = x / 1000 sekund. Następnie z sekund = z / 60 minut. Możesz zrobić z% 60, aby znaleźć liczbę pozostałych sekund.
Kon

4
podstawowa matematyka: 1000 milisekund = 1 sekunda. 60 sekund = 1 minuta.
Marc B,

1
Sprawdź ten post: stackoverflow.com/questions/625433/… . Powinien dostać to, czego chcesz.
bmac151

1
To naprawdę proste pytanie. Czego próbowałeś?
Przywróć Monikę - notmaynard

Odpowiedzi:


192

Sugerowałbym użycie TimeUnit. Możesz go używać w ten sposób:

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

Moim jedynym problemem jest to, że nie wiem: jak zdefiniować milisę (zwraca to, że „milis nie można rozwiązać na zmienną” i nie wiem, jak uzyskać do niego dostęp w metodzie System.out.println ();.

Możesz to zrobić używając samych liczb, jeśli milisekundy są już czymś w rodzaju długich. Nie ma potrzeby wprowadzania nowej biblioteki, aby wykonać proste obliczenia. minutes = ((milliseconds / 1000) / 60)
Kyle Falconer

2
Wydaje się, że jest to najlepsza odpowiedź dla Java od 5 do 7.
Sean Barbeau

7
@Sotti Brilliant? To nie odpowiada na pytanie! Pytanie pyta o minuty i sekundy, ponieważ odczyt stopera, na przykład 1 minute 30 secondsta odpowiedź, podaje minuty lub sekundy 1 minute 90 seconds.
Basil Bourque

1
Chciałbym go używać, ale z sekundami jako podwójnymi, a nie z intami, na przykład 1,5s. Czy to jest możliwe?
Linia

49

Po przeliczeniu milis na sekundy (dzieląc przez 1000), możesz użyć, / 60aby uzyskać wartość minut i % 60(reszta), aby uzyskać wartość „sekund w minutach”.

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


25

tl; dr

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

Java 9 i nowsze

W Javie 9 i nowszych utwórz a Durationi wywołaj to…Partmetody. W tym przypadku: toMinutesParti toSecondsPart.

Uchwyć początek i koniec stopera.

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

Przedstawia upływający czas w Durationobiekcie.

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

Zapytaj o każdą część, minuty i sekundy.

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

Możesz także chcieć sprawdzić, czy stoper działał zgodnie z oczekiwaniami.

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

Java 8

W Javie 8 tej Durationklasie brakuje to…Partmetod. Będziesz musiał wykonać obliczenia matematyczne, jak pokazano w innych odpowiedziach.

long entireDurationAsSeconds = d.getSeconds();

Albo zróbmy Durationmatematykę.

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

Zobacz kod na żywo w IdeOne.com .

Interwał: 2016-12-18T08: 39: 34.099Z / 2016-12-18T08: 41: 49.099Z

d.toString (): PT2M15S

d.getSeconds (): 135

Upłynęło: 2 M 15 S.

Rozkład

FYI, rozdzielczość nowmetod zmieniona między Java 8 i Java 9. Zobacz to pytanie .

  • Java 9 rejestruje moment z rozdzielczością rzędu nanosekund. Rozdzielczość zależy od możliwości sprzętu komputera. Widzę mikrosekundy (sześć cyfr dziesiętnych) na MacBooku Pro Retina z macOS Sierra.
  • Java 8 rejestruje moment tylko do milisekund. Implementacja Clockjest ograniczona do rozdzielczości milisekund. Możesz więc przechowywać wartości w nanosekundach, ale przechwytywać je tylko w milisekundach.

Informacje o java.time

Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date, Calendar, i SimpleDateFormat.

Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .

Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby stosowania ciągów ani java.sql.*klas.

Skąd wziąć klasy java.time?

Tabela opisująca bibliotekę java.time, która ma być używana z którą wersją Javy lub Androida


do połączeń z Androidem wymagany jest poziom API 26.
Killer

@Killer W przypadku wcześniejszego Androida zobacz projekty ThreeTen-Backport i ThreeTenABP .
Basil Bourque

12

To tylko podstawowa matematyka. 1000 milisekund = 1 sekunda i 60000 milisekund = 1 minuta; Więc po prostu zrób

int seconds=(millis/1000)%60;

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

16
Jest błąd - druga linia powinna być(millis/1000-seconds)/60
Nayuki

10

Tworzyłem aplikację odtwarzacza mp3 na Androida, więc zrobiłem to w ten sposób, aby uzyskać aktualny czas i czas trwania

 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

Oto pełny program

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 );

}
}

Znalazłem ten program tutaj " Link " tam jest szczegółowo wyjaśniony.


1
To nie odpowiada na pytanie . Pytanie prosi o minuty i sekundy, jako odczyt stopera. Dajesz dwa oddzielne wyniki, minuty lub sekundy. D
Basil Bourque

6

X milisekund = X / 1000 sekund = (X / 1000) / 60 minut

Jeśli masz 100 000 milisekund, podziel tę wartość przez 1000 i zostanie ci 100 sekund. Teraz 100/60 = 1,666 ~ minuty, ale ułamki minut nie mają wartości, więc: zrób 100% 60 = 40 sekund, aby znaleźć resztę, a następnie dzielenie liczb całkowitych 100/60 = 1 minuta, z resztą 40 sekund. Odpowiedź: 1 minuta, 40 sekund.


5

Aby przekonwertować czas w milisach bezpośrednio na minuty: możesz użyć tego drugiego formatu

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

To zwróci ciąg z czasem we właściwym formatowaniu. U mnie to zadziałało.


Ach, dobry! Właśnie przetestowałem na zegarze, który był w milisekundach i działał!
esQmo_

5

Aby uzyskać aktualną godzinę, minuty i sekundy wyświetlane na zegarku, wypróbuj ten kod

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

5

Możesz spróbować postępować w ten sposób:

Przekaż wartość ms z

Long ms = watch.getTime();

do

getDisplayValue(ms)

Wdrożenie 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"
}

Implementacja 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);
  }

Testowanie

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

Wynik

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

3

Myślę, że Java 1.5 nie obsługuje współbieżnego TimeUnit. W przeciwnym razie sugerowałbym TimeUnit. Poniżej jest oparte na podejściu czysto matematycznym.

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

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

1

Możesz łatwo zamienić milisekundy na sekundy, minuty i godziny.

                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

Poniższy kod działa przy konwersji ms na min: secs w formacie [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

Oto proste rozwiązanie. Przykładowe wywołania, których można użyć w dowolnej metodzie:

  • StopWatch.start();
  • StopWatch.stop();
  • StopWatch.displayDiff();wyświetla różnicę w minutach i sekundach między uruchomieniem a zatrzymaniem. (czas, który upłynął)

    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
Błędny. toMillisMetoda zgłasza cały czas jako milisekund.
Basil Bourque
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.