Sekundenwert in Stunden Minuten Sekunden umwandeln?


109

Ich habe versucht, einen Wert von Sekunden (in einer BigDecimal-Variablen) in eine Zeichenfolge in einem editText wie "1 Stunde 22 Minuten 33 Sekunden" oder etwas Ähnlichem zu konvertieren.

Ich habe das versucht:

String sequenceCaptureTime = "";
BigDecimal roundThreeCalc = new BigDecimal("0");
BigDecimal hours = new BigDecimal("0");
BigDecimal myremainder = new BigDecimal("0");
BigDecimal minutes = new BigDecimal("0");
BigDecimal seconds = new BigDecimal("0");
BigDecimal var3600 = new BigDecimal("3600");
BigDecimal var60 = new BigDecimal("60");

(Ich habe einen roundThreeCalc, der der Wert in Sekunden ist, also versuche ich ihn hier zu konvertieren.)

hours = (roundThreeCalc.divide(var3600));
myremainder = (roundThreeCalc.remainder(var3600));
minutes = (myremainder.divide(var60));
seconds = (myremainder.remainder(var60));
sequenceCaptureTime =  hours.toString() + minutes.toString() + seconds.toString();

Dann setze ich den editText auf sequnceCaptureTime String. Aber das hat nicht funktioniert. Es erzwingt jedes Mal das Schließen der App. Ich bin hier total überfordert, jede Hilfe wird sehr geschätzt. Viel Spaß beim Codieren!



Gibt es einen Grund, warum Sie BigDecimal anstelle von BigInteger verwenden?
Ted Hopp

Ich werde Bruchteile einer Sekunde später in dev implementieren müssen. Im Moment versuche ich nur, die Berechnung überhaupt zum Laufen zu bringen.
Rabbitt

1
Ich stimme Richards Kommentar zu - Sie können die TimeUnit-Enumeration verwenden, um einen Großteil der Arbeit für Sie zu erledigen. developer.android.com/reference/java/util/concurrent/…
Ben J

Wie würde ich Timeunit verwenden, um von einem BigDecimal mit Sekunden in HHMMSS zu konvertieren?
Rabbitt

Antworten:


65

Sie sollten mehr Glück mit haben

hours = roundThreeCalc.divide(var3600, BigDecimal.ROUND_FLOOR);
myremainder = roundThreeCalc.remainder(var3600);
minutes = myremainder.divide(var60, BigDecimal.ROUND_FLOOR);
seconds = myremainder.remainder(var60);

Dadurch werden die Dezimalwerte nach jeder Division gelöscht.

Bearbeiten: Wenn das nicht funktioniert hat, versuchen Sie dies. (Ich habe es gerade geschrieben und getestet)

public static int[] splitToComponentTimes(BigDecimal biggy)
{
    long longVal = biggy.longValue();
    int hours = (int) longVal / 3600;
    int remainder = (int) longVal - hours * 3600;
    int mins = remainder / 60;
    remainder = remainder - mins * 60;
    int secs = remainder;

    int[] ints = {hours , mins , secs};
    return ints;
}

6
Diese Lösung ist eleganter
Alex

@ AlexKucherenko außer dass die Lösung mit Millisekunden funktioniert
Mikhail

1
Mit @Mikhail TimeUnit. #### können Sie dies mit jeder Zeiteinheit tun.
Amir Omidi

1
Wann immer Sie mit Zeit- und Datumswerten rechnen, müssen Sie sich selbst stoppen und die richtige API in der jeweiligen Sprache finden. Wenn Sie nur eine Antwort vom Typ HH: MM: SS benötigen, sind Sie besser dran mit DateUtils.formatElapsedTime...
Schwalbengespräch

229

Ist es notwendig, ein BigDecimal zu verwenden? Wenn Sie nicht müssen, würde ich ein int oder long für Sekunden verwenden, und es würde die Dinge ein wenig vereinfachen:

hours = totalSecs / 3600;
minutes = (totalSecs % 3600) / 60;
seconds = totalSecs % 60;

timeString = String.format("%02d:%02d:%02d", hours, minutes, seconds);

Möglicherweise möchten Sie die einzelnen Zeichen auffüllen, um sicherzustellen, dass sie zweistellige Werte (oder was auch immer) in der Zeichenfolge enthalten.


Ich werde Bruchteile einer Sekunde später in dev implementieren müssen. Im Moment versuche ich nur, die Berechnung überhaupt zum Laufen zu bringen.
Rabbitt

13
String.format("%02d:%02d:%02d", hours, minutes, seconds);
Jeffrey Blattman

Das ist einfach beeindruckend. Ich frage mich, wie der Modul auf diese Weise funktionieren könnte.
PSo

Verwenden Sie das Gebietsschema, da Sie sonst gewarnt werden. String.format(Locale.ENGLISH, "%02d:%02d:%02d", hours, minutes, seconds)
Pratik Butani

1
Wann immer Sie mit Zeit- und Datumswerten rechnen, müssen Sie sich selbst stoppen und die richtige API in der jeweiligen Sprache finden. Wenn Sie nur eine Antwort vom Typ HH: MM: SS benötigen, sind Sie besser dran mit DateUtils.formatElapsedTime...
Schwalbengespräch

74

DateUtils.formatElapsedTime(long), formatiert eine verstrichene Zeit in der Form " MM:SS" oder " H:MM:SS". Es gibt den gesuchten String zurück. Die Dokumentation finden Sie hier


3
Dieser ist einfach und genau das, was ich brauche. Ich empfehle anderen diese Methode
Nabin

1
Vergessen Sie nicht, dass der Parameter in Sekunden erwartet wird. Sie müssen also Millis in Sekunden
umrechnen

28

Hier ist der Arbeitscode:

private String getDurationString(int seconds) {

    int hours = seconds / 3600;
    int minutes = (seconds % 3600) / 60;
    seconds = seconds % 60;

    return twoDigitString(hours) + " : " + twoDigitString(minutes) + " : " + twoDigitString(seconds);
}

private String twoDigitString(int number) {

    if (number == 0) {
        return "00";
    }

    if (number / 10 == 0) {
        return "0" + number;
    }

    return String.valueOf(number);
}

3
Ich mag diese Antwort, aber Sie müssen '% 10' in '/ 10'
ändern

Wann immer Sie mit Zeit- und Datumswerten rechnen, müssen Sie sich selbst stoppen und die richtige API in der jeweiligen Sprache finden. Wenn Sie nur eine Antwort vom Typ HH: MM: SS benötigen, sind Sie besser dran mit DateUtils.formatElapsedTime...
Schwalbengespräch

27

Etwas wirklich hilfreiches in Java 8

import java.time.LocalTime;

private String ConvertSecondToHHMMSSString(int nSecondTime) {
    return LocalTime.MIN.plusSeconds(nSecondTime).toString();
}

Hinweis: Bei Verwendung von plusSeconds (lange Sekunden) wird die Berechnung gegen Mitternacht abgeschlossen. Beispiel: Wenn Sekunden 86400 (24 Stunden) sind, wird 00:00 ausgegeben.
Karthi

Es macht genau das, was der Name 'ConvertSecondToHHMMSSString' andeutet. Die anderen (langwierigen) Lösungen wickeln sich ebenfalls ab.
Epikurist

@Epicurist das war die Lösung, die ich gesucht habe! Viel eleganter und als alle anderen! :)
Paulo Oliveira

20

Ich bevorzuge die in Java eingebaute TimeUnit- Bibliothek

long seconds = TimeUnit.MINUTES.toSeconds(8);

12
private String ConvertSecondToHHMMString(int secondtTime)
{
  TimeZone tz = TimeZone.getTimeZone("UTC");
  SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
  df.setTimeZone(tz);
  String time = df.format(new Date(secondtTime*1000L));

  return time;

}

Sie können Ihre Antwort weiter verbessern, indem Sie erklären, was der Code tut und wie er das Problem löst
;-)

9

Das ist meine einfache Lösung:

String secToTime(int sec) {
    int seconds = sec % 60;
    int minutes = sec / 60;
    if (minutes >= 60) {
        int hours = minutes / 60;
        minutes %= 60;
        if( hours >= 24) {
            int days = hours / 24;
            return String.format("%d days %02d:%02d:%02d", days,hours%24, minutes, seconds);
        }
        return String.format("%02d:%02d:%02d", hours, minutes, seconds);
    }
    return String.format("00:%02d:%02d", minutes, seconds);
}

Test Results::

Result: 00:00:36 - 36
Result: 01:00:07 - 3607
Result: 6313 days 12:39:05 - 545488745

6

Ich mag es deshalb einfach zu halten:

    int tot_seconds = 5000;
    int hours = tot_seconds / 3600;
    int minutes = (tot_seconds % 3600) / 60;
    int seconds = tot_seconds % 60;

    String timeString = String.format("%02d Hour %02d Minutes %02d Seconds ", hours, minutes, seconds);

    System.out.println(timeString);

Das Ergebnis ist: 01 Stunde 23 Minuten 20 Sekunden


kürzeste Antwort, Awesome
Kaveh Garshasp

5

Wenn Sie die Einheiten und für eine Dauer möchten h, können Sie dies verwenden:minsec

public static String convertSeconds(int seconds) {
    int h = seconds/ 3600;
    int m = (seconds % 3600) / 60;
    int s = seconds % 60;
    String sh = (h > 0 ? String.valueOf(h) + " " + "h" : "");
    String sm = (m < 10 && m > 0 && h > 0 ? "0" : "") + (m > 0 ? (h > 0 && s == 0 ? String.valueOf(m) : String.valueOf(m) + " " + "min") : "");
    String ss = (s == 0 && (h > 0 || m > 0) ? "" : (s < 10 && (h > 0 || m > 0) ? "0" : "") + String.valueOf(s) + " " + "sec");
    return sh + (h > 0 ? " " : "") + sm + (m > 0 ? " " : "") + ss;
}

int seconds = 3661;
String duration = convertSeconds(seconds);

Das sind viele bedingte Operatoren. Die Methode gibt die folgenden Zeichenfolgen zurück:

0    -> 0 sec
5    -> 5 sec
60   -> 1 min
65   -> 1 min 05 sec
3600 -> 1 h
3601 -> 1 h 01 sec
3660 -> 1 h 01
3661 -> 1 h 01 min 01 sec
108000 -> 30 h

Schöne Lösung (Y)
Akshay Raiyani

4

Dieser Code funktioniert einwandfrei:

txtTimer.setText(String.format("%02d:%02d:%02d",(SecondsCounter/3600), ((SecondsCounter % 3600)/60), (SecondsCounter % 60)));

4

Eine schöne und einfache Möglichkeit, dies mit GregorianCalendar zu tun

Importieren Sie diese in das Projekt:

import java.util.GregorianCalendar;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Scanner;

Und dann:

Scanner s = new Scanner(System.in);

System.out.println("Seconds: ");
int secs = s.nextInt();

GregorianCalendar cal = new GregorianCalendar(0,0,0,0,0,secs);
Date dNow = cal.getTime();
SimpleDateFormat ft = new SimpleDateFormat("HH 'hours' mm 'minutes' ss 'seconds'");
System.out.println("Your time: " + ft.format(dNow));

1
Ich liebe diesen!
Eduyayo

2

Ich benutze das:

 public String SEG2HOR( long lnValue) {     //OK
        String lcStr = "00:00:00";
        String lcSign = (lnValue>=0 ? " " : "-");
        lnValue = lnValue * (lnValue>=0 ? 1 : -1); 

        if (lnValue>0) {                
            long lnHor  = (lnValue/3600);
            long lnHor1 = (lnValue % 3600);
            long lnMin  = (lnHor1/60);
            long lnSec  = (lnHor1 % 60);            

                        lcStr = lcSign + ( lnHor < 10 ? "0": "") + String.valueOf(lnHor) +":"+
                              ( lnMin < 10 ? "0": "") + String.valueOf(lnMin) +":"+
                              ( lnSec < 10 ? "0": "") + String.valueOf(lnSec) ;
        }

        return lcStr;           
    }

2

Hier ist meine Funktion, um das Problem anzugehen:

public static String getConvertedTime(double time){

    double h,m,s,mil;

    mil = time % 1000;
    s = time/1000;
    m = s/60;
    h = m/60;
    s = s % 60;
    m = m % 60;
    h = h % 24;

    return ((int)h < 10 ? "0"+String.valueOf((int)h) : String.valueOf((int)h))+":"+((int)m < 10 ? "0"+String.valueOf((int)m) : String.valueOf((int)m))
            +":"+((int)s < 10 ? "0"+String.valueOf((int)s) : String.valueOf((int)s))
            +":"+((int)mil > 100 ? String.valueOf((int)mil) : (int)mil > 9 ? "0"+String.valueOf((int)mil) : "00"+String.valueOf((int)mil));
}

Warum verwendet dieses Kind doppelt typisierte Variablen, um die erforderlichen Ints zu speichern?
Epikurist

2

Ich weiß, das ist ziemlich alt, aber in Java 8:

LocalTime.MIN.plusSeconds(120).format(DateTimeFormatter.ISO_LOCAL_TIME)

2

Verwenden Sie dies für Minuten und Sekunden

String.format("%02d:%02d", (seconds / 3600 * 60 + ((seconds % 3600) / 60)), (seconds % 60))

1

Ich verwende dies in Python, um einen Float zu konvertieren, der Sekunden in Stunden, Minuten, Sekunden und Mikrosekunden darstellt. Es ist einigermaßen elegant und praktisch für die Konvertierung in einen Datetime-Typ über strptime zum Konvertieren. Bei Bedarf kann es auch problemlos auf längere Intervalle (Wochen, Monate usw.) ausgedehnt werden.

    def sectohmsus(seconds):
        x = seconds
        hmsus = []
        for i in [3600, 60, 1]:  # seconds in a hour, minute, and second
            hmsus.append(int(x / i))
            x %= i
        hmsus.append(int(round(x * 1000000)))  # microseconds
        return hmsus  # hours, minutes, seconds, microsecond

1

Ich habe den besten Weg und weniger Code ausprobiert, aber vielleicht ist es ein bisschen schwierig zu verstehen, wie ich meinen Code geschrieben habe, aber wenn Sie gut in Mathe sind, ist es so einfach

import java.util.Scanner;

Unterrichtsstunden {

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    double s;


    System.out.println("how many second you have ");
    s =input.nextInt();



     double h=s/3600;
     int h2=(int)h;

     double h_h2=h-h2;
     double m=h_h2*60;
     int m1=(int)m;

     double m_m1=m-m1;
     double m_m1s=m_m1*60;






     System.out.println(h2+" hours:"+m1+" Minutes:"+Math.round(m_m1s)+" seconds");





}

}}

mehr darüber ist genau!


1

Mit Java 8 können Sie leicht Zeit im String-Format von langen Sekunden wie erreichen,

LocalTime.ofSecondOfDay(86399L)

Hier darf der angegebene Wert maximal konvertiert werden (bis zu 24 Stunden) und das Ergebnis ist

23:59:59

Vorteile: 1) Sie müssen nicht manuell konvertieren und 0 für eine einzelne Ziffer anhängen

Nachteile: Arbeiten Sie nur bis zu 24 Stunden


1

Mit Java 8 können Sie problemlos Zeit im LocalTime-Format aus langen Sekunden wie erreichen.

LocalTime.ofSecondOfDay(86399L)

Hier darf der angegebene Wert maximal konvertiert werden (bis zu 24 Stunden) und das Ergebnis ist

23:59:59

Vorteile: 1) Sie müssen nicht manuell konvertieren und 0 für eine einzelne Ziffer anhängen

Nachteile: Arbeiten Sie nur bis zu 24 Stunden


1

Dauer von java.time

    BigDecimal secondsValue = BigDecimal.valueOf(4953);
    if (secondsValue.compareTo(BigDecimal.valueOf(Long.MAX_VALUE)) > 0) {
        System.out.println("Seconds value " + secondsValue + " is out of range");
    } else {
        Duration dur = Duration.ofSeconds(secondsValue.longValueExact());
        long hours = dur.toHours();
        int minutes = dur.toMinutesPart();
        int seconds = dur.toSecondsPart();

        System.out.format("%d hours %d minutes %d seconds%n", hours, minutes, seconds);
    }

Die Ausgabe dieses Snippets lautet:

1 Stunde 22 Minuten 33 Sekunden

Wenn der BigDecimalCode einen Bruchteil der Sekunde ungleich Null enthalten hätte, hätte er in seiner jetzigen Form nicht funktioniert, aber Sie können ihn möglicherweise ändern. Der Code funktioniert in Java 9 und höher. In Java 8 ist die Konvertierung von Durationin Stunden, Minuten und Sekunden etwas wortreicher. Weitere Informationen finden Sie unter dem Link unten. Ich überlasse es Ihnen, die richtige Singular- oder Pluralform der Wörter ( Stunde oder Stunden usw.) zu wählen .

Links

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.