Convertir la valeur des secondes en heures minutes secondes?


109

J'ai essayé de convertir une valeur de secondes (dans une variable BigDecimal) en une chaîne dans un editText comme "1 heure 22 minutes 33 secondes" ou quelque chose du genre.

J'ai essayé ceci:

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

(J'ai un roundThreeCalc qui est la valeur en secondes donc j'essaye de le convertir ici.)

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

Ensuite, j'ai défini editText sur sequnceCaptureTime String. Mais cela n'a pas fonctionné. Cela force la fermeture de l'application à chaque fois. Je suis totalement hors de ma portée ici, toute aide est grandement appréciée. Bon codage!



Une raison pour laquelle vous utilisez BigDecimal au lieu de BigInteger?
Ted Hopp

Je devrai implémenter des fractions de seconde plus tard dans le développement, en ce moment j'essaie simplement de faire fonctionner le calcul en premier lieu.
rabbitt

1
J'appuie le commentaire de Richard - vous pouvez utiliser l'énumération TimeUnit pour faire une grande partie du travail à votre place. developer.android.com/reference/java/util/concurrent/…
Ben J

Comment utiliser timeunit pour convertir un BigDecimal avec des secondes en HHMMSS?
rabbitt

Réponses:


65

Tu devrais avoir plus de chance avec

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

Cela supprimera les valeurs décimales après chaque division.

Edit: Si cela ne fonctionne pas, essayez ceci. (Je viens de l'écrire et de le tester)

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
Cette solution est plus gracieuse: stackoverflow.com/questions/625433/…
Alex Kucherenko

@AlexKucherenko sauf que la solution fonctionne avec des millisecondes
Mikhail

1
@Mikhail TimeUnit. #### vous permettra de le faire avec n'importe quelle unité de temps.
Amir Omidi

1
Chaque fois que vous vous retrouvez à faire des maths avec des valeurs d'heure et de date, vous devez vous arrêter et trouver la bonne API dans la langue à portée de main. Si vous avez juste besoin d'une réponse de type HH: MM: SS, vous serez mieux avec DateUtils.formatElapsedTime...
dovetalk

229

Est-il nécessaire d'utiliser un BigDecimal? Si vous n'êtes pas obligé, j'utiliserais un int ou long pendant secondes, et cela simplifierait un peu les choses:

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

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

Vous voudrez peut-être remplir chacun pour vous assurer qu'il s'agit de valeurs à deux chiffres (ou autre) dans la chaîne, cependant.


Je devrai implémenter des fractions de seconde plus tard dans le développement, en ce moment j'essaie simplement de faire fonctionner le calcul en premier lieu.
rabbitt

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

C'est tout simplement impressionnant. Je me demande comment le module pourrait fonctionner de cette manière.
PSo

Utilisez Locale sinon cela vous donnera un avertissement. String.format(Locale.ENGLISH, "%02d:%02d:%02d", hours, minutes, seconds)
Pratik Butani

1
Chaque fois que vous vous retrouvez à faire des maths avec des valeurs d'heure et de date, vous devez vous arrêter et trouver la bonne API dans la langue à portée de main. Si vous avez juste besoin d'une réponse de type HH: MM: SS, vous serez mieux avec DateUtils.formatElapsedTime...
dovetalk

75

DateUtils.formatElapsedTime(long), met en forme un temps écoulé sous la forme " MM:SS" ou " H:MM:SS". Il renvoie la chaîne que vous recherchez. Vous pouvez trouver la documentation ici


3
Celui-ci est simple et exactement ce dont j'ai besoin. Je recommande aux autres cette méthode
Nabin

1
N'oubliez pas qu'il attend un paramètre en quelques secondes. Vous devez donc convertir des millis en secondes
kiranking

28

Voici le code de travail:

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
J'aime cette réponse mais vous devez changer '% 10' en '/ 10'
Hakem Zaied

Chaque fois que vous vous retrouvez à faire des maths avec des valeurs d'heure et de date, vous devez vous arrêter et trouver la bonne API dans la langue à portée de main. Si vous avez juste besoin d'une réponse de type HH: MM: SS, vous serez mieux avec DateUtils.formatElapsedTime...
dovetalk

28

Quelque chose de vraiment utile dans Java 8

import java.time.LocalTime;

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

Remarque: Le calcul tourne autour de minuit lors de l'utilisation de plusSeconds (longues secondes), par exemple: si les secondes sont 86400 (24 heures), il renvoie 00:00.
karthi

Il fait exactement ce que son nom suggère «ConvertSecondToHHMMSSString». Les autres solutions (fastidieuses) se déroulent également.
Epicurist

@Epicurist c'était la solution que je cherchais! Beaucoup plus élégant et que tous les autres! :)
Paulo Oliveira le

20

Je préfère la bibliothèque TimeUnit intégrée de Java

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;

}

Vous pouvez encore améliorer votre réponse en expliquant ce que fait le code et comment il résout le problème ;-)
2Dee

9

Voici ma solution simple:

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

J'aime garder les choses simples donc:

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

Le résultat sera: 01 heure 23 minutes 20 secondes


Réponse la plus courte, génial
Kaveh Garshasp

5

Si vous voulez les unités h, minet secpour une durée, vous pouvez utiliser ceci:

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

C'est beaucoup d'opérateurs conditionnels. La méthode retournera ces chaînes:

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

Belle solution (Y)
Akshay Raiyani

4

Ce code fonctionne bien:

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

4

Un moyen simple et agréable de le faire en utilisant GregorianCalendar

Importez-les dans le projet:

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

Puis:

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
J'aime celui la!
eduyayo

2

J'utilise ceci:

 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

Voici ma fonction pour résoudre le problème:

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

Pourquoi cette façon infantile d'utiliser des variables à double typage pour stocker les entrées nécessaires?
Epicurist le

2

Je sais que c'est assez vieux mais en java 8:

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

2

pendant quelques minutes et secondes utilisez ceci

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

1

J'utilise ceci en python pour convertir un flottant représentant des secondes en heures, minutes, secondes et microsecondes. C'est raisonnablement élégant et pratique pour la conversion en un type datetime via strptime pour convertir. Il pourrait également être facilement étendu à des intervalles plus longs (semaines, mois, etc.) si nécessaire.

    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

J'ai essayé le meilleur moyen et moins de code, mais c'est peut-être un peu difficile de comprendre comment j'ai écrit mon code, mais si vous êtes bon en maths, c'est si facile

import java.util.Scanner;

heures de cours {

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





}

}

en plus c'est précis!


1

Avec Java 8, vous pouvez facilement atteindre le temps au format String à partir de longues secondes comme,

LocalTime.ofSecondOfDay(86399L)

Ici, la valeur donnée est maximale autorisée à convertir (jusqu'à 24 heures) et le résultat sera

23:59:59

Avantages: 1) Pas besoin de convertir manuellement et d'ajouter 0 pour un seul chiffre

Inconvénients: ne travaillez que pendant 24 heures maximum


1

Avec Java 8, vous pouvez facilement atteindre le temps au format LocalTime à partir de longues secondes comme,

LocalTime.ofSecondOfDay(86399L)

Ici, la valeur donnée est maximale autorisée à convertir (jusqu'à 24 heures) et le résultat sera

23:59:59

Avantages: 1) Pas besoin de convertir manuellement et d'ajouter 0 pour un seul chiffre

Inconvénients: ne travaillez que pendant 24 heures maximum


1

Durée depuis 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);
    }

La sortie de cet extrait de code est:

1 heures 22 minutes 33 secondes

S'il y avait eu une fraction de seconde non nulle dans le BigDecimalcode, ce code n'aurait pas fonctionné tel quel, mais vous pourrez peut-être le modifier. Le code fonctionne dans Java 9 et versions ultérieures. Dans Java 8, la conversion Durationen heures, minutes et secondes est un peu plus verbeuse, voir le lien en bas pour savoir comment. Je vous laisse choisir la bonne forme singulière ou plurielle des mots ( heure ou heures , etc.).

Liens

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.