web-dev-qa-db-fra.com

Java: convertissez les secondes en jour, heure, minute et seconde en utilisant TimeUnit

J'utilise la classe TimeStamp pour convertir les secondes en jour, heures, minutes, secondes. J'ai utilisé le code suivant

public static void calculateTime(long seconds) {
        int day = (int)TimeUnit.SECONDS.toDays(seconds);        
        long hours = TimeUnit.SECONDS.toHours(seconds) - TimeUnit.SECONDS.toHours(TimeUnit.SECONDS.toDays(seconds));
        long minute = TimeUnit.SECONDS.toMinutes(seconds) - TimeUnit.SECONDS.toMinutes(TimeUnit.SECONDS.toHours(seconds));
        long second = TimeUnit.SECONDS.toSeconds(seconds) - TimeUnit.SECONDS.toSeconds(TimeUnit.SECONDS.toMinutes(seconds));

        System.out.println("Day " + day + " Hour " + hours + " Minute " + minute + " Seconds " + second);

    }

Mais je n'obtiens pas le bon résultat. Par exemple, lorsque j'ai appelé cette méthode en tant que calculateTime(3600) elle me donne le résultat sous la forme Day 0 Hour 1 Minute 60 Seconds 3540 Au lieu de Day 0 Hour 1 Minute 0 Seconds 0.

Quel est le problème avec ma logique? S'il vous plaît, aidez-moi.

41
Android Learner

Ça devrait être comme

 int day = (int)TimeUnit.SECONDS.toDays(seconds);        
 long hours = TimeUnit.SECONDS.toHours(seconds) - (day *24);
 long minute = TimeUnit.SECONDS.toMinutes(seconds) - (TimeUnit.SECONDS.toHours(seconds)* 60);
 long second = TimeUnit.SECONDS.toSeconds(seconds) - (TimeUnit.SECONDS.toMinutes(seconds) *60);

MODIFIER Explication:

  1. Le calcul du jour est correct ne nécessite pas d'explication.
  2. TimeUnit.SECONDS.toHours (secondes) vous donnera une conversion directe de secondes en heures sans tenir compte des jours que vous avez déjà calculés. Moins les heures pour les jours que vous avez déjà obtenus, c'est-à-dire le jour * 24. Vous avez maintenant les heures restantes.
  3. Pareil pour minute et seconde. Vous devez respectivement réduire l'heure et les minutes déjà obtenues.
90
Subir Kumar Sao

Vous pouvez faire comme ça pour utiliser uniquement TimeUnit:

public static void calculateTime(long seconds) {
    int day = (int) TimeUnit.SECONDS.toDays(seconds);
    long hours = TimeUnit.SECONDS.toHours(seconds) -
                 TimeUnit.DAYS.toHours(day);
    long minute = TimeUnit.SECONDS.toMinutes(seconds) - 
                  TimeUnit.DAYS.toMinutes(day) -
                  TimeUnit.HOURS.toMinutes(hours);
    long second = TimeUnit.SECONDS.toSeconds(seconds) -
                  TimeUnit.DAYS.toSeconds(day) -
                  TimeUnit.HOURS.toSeconds(hours) - 
                  TimeUnit.MINUTES.toSeconds(minute);
    System.out.println("Day " + day + " Hour " + hours + " Minute " + minute + " Seconds " + second);
}

ou légèrement plus courte mais peut-être pas aussi intuitive

public static void calculateTime(long seconds) {
    int day = (int) TimeUnit.SECONDS.toDays(seconds);
    long hours = TimeUnit.SECONDS.toHours(seconds) -
                 TimeUnit.DAYS.toHours(day);
    long minute = TimeUnit.SECONDS.toMinutes(seconds) -
                  TimeUnit.HOURS.toMinutes(TimeUnit.SECONDS.toHours(seconds));
    long second = TimeUnit.SECONDS.toSeconds(seconds) -
                  TimeUnit.MINUTES.toSeconds(TimeUnit.SECONDS.toMinutes(seconds));
    System.out.println("Day " + day + " Hour " + hours + " Minute " + minute + " Seconds " + second);
}
12
Keppil

Méthode simple:

public static void calculateTime(long seconds) {
    long sec = seconds % 60;
    long minutes = seconds % 3600 / 60;
    long hours = seconds % 86400 / 3600;
    long days = seconds / 86400;

    System.out.println("Day " + days + " Hour " + hours + " Minute " + minutes + " Seconds " + sec);
}
7
Diemon

Voici un code que j'ai créé: (pendant 3600 secondes, il affiche "jours: 0 heures: 1 minutes: 0 secondes: 0")

public class TimeConvert 
{
    public static void main(String[] args) 
    {
        int fsec,d,h,m,s,temp=0,i;
        fsec=3600;
        //For Days
        if(fsec>=86400)
        {
            temp=fsec/86400;
            d=temp;
            for(i=1;i<=temp;i++)
            {
                fsec-=86400;
            }
        }
        else
        {
            d=0;
        }
        //For Hours
        if(fsec>=3600)
        {
            temp=fsec/3600;
            h=temp;
            for(i=1;i<=temp;i++)
            {
                fsec-=3600;
            }            
        }
        else
        {
            h=0;
        }
        //For Minutes
        if(fsec>=60)
        {
            temp=fsec/60;
            m=temp;
            for(i=1;i<=temp;i++)
            {
                fsec-=60;
            }            
        }
        else
        {
            m=0;
        }
        //For Seconds
        if(fsec>=1)
        {
            s=fsec;            
        }
        else
        {
            s=0;
        }
        System.out.println("Days:"+d+" Hours:"+h+" Minutes:"+m+" Seconds:"+s);
    }
}

J'espère que cela répond à votre question.

2
codeDEXTER

en retard mais utile

obtenir l'heure au format 00:00:00

/**
     * The time in format.
     *
     * in The Format of 00:00:00
     */

public String getTimeInFormat(long _SECONDS)
{
    if(TimeUnit.SECONDS.toHours(_SECONDS)>0)
    {
        return  String.format("%02d:%02d:%02d",
                TimeUnit.SECONDS.toHours(_SECONDS),
                TimeUnit.SECONDS.toMinutes(_SECONDS) -
                        TimeUnit.HOURS.toMinutes(TimeUnit.SECONDS.toHours(_SECONDS)),
                TimeUnit.SECONDS.toSeconds(_SECONDS) -
                        TimeUnit.MINUTES.toSeconds(TimeUnit.SECONDS.toMinutes(_SECONDS)));
    }
    else {
        return  String.format("%02d:%02d",
                TimeUnit.SECONDS.toMinutes(_SECONDS) -
                        TimeUnit.HOURS.toMinutes(TimeUnit.SECONDS.toHours(_SECONDS)),
                TimeUnit.SECONDS.toSeconds(_SECONDS) -
                        TimeUnit.MINUTES.toSeconds(TimeUnit.SECONDS.toMinutes(_SECONDS)));
    }

}
1
Ashvin solanki

Voici mon code:

public static String secondsToString(TimeUnit greatestUnit, long sourceDuration, TimeUnit sourceUnit) {

    int ordinal = greatestUnit.ordinal();
    if(ordinal<=sourceUnit.ordinal())
        return String.format("%02d", sourceDuration);

    final long greatestDuration = greatestUnit.convert(sourceDuration, sourceUnit);
    final long rest = sourceDuration - sourceUnit.convert(greatestDuration, greatestUnit);

    return String.format("%02d:", greatestDuration) + secondsToString(TimeUnit.values()[--ordinal], rest, sourceUnit);
}

ou par boucle

public static String secondsToStringByLoop(TimeUnit greatestUnit, long sourceDuration, TimeUnit sourceUnit) {

    final StringBuffer sb = new StringBuffer();
    int ordinal = greatestUnit.ordinal();

    while(true){
        if(ordinal<=sourceUnit.ordinal()) {
            sb.append(String.format("%02d", sourceDuration));
            break;
        }

        final long greatestDuration = greatestUnit.convert(sourceDuration, sourceUnit);
//          if(greatestDuration>0 || sb.length()>0)
        sb.append(String.format("%02d:", greatestDuration));

        sourceDuration -= sourceUnit.convert(greatestDuration, greatestUnit);
        greatestUnit = TimeUnit.values()[--ordinal];
    };

    return sb.toString();
}

exemple d'utilisation:

String str = secondsToString(TimeUnit.DAYS, 1000, TimeUnit.SECONDS);

la fonction renvoie: "00: 00: 16: 40" (jours: heures: minutes: secondes)

str = UnitsConverter.secondsToString(TimeUnit.DAYS, 1000, TimeUnit.MINUTES);

renvoie: "00:16:40" (jours: heures: minutes)

str = UnitsConverter.secondsToString(TimeUnit.MINUTES, 1000, TimeUnit.SECONDS);

renvoie: "16:40" (minutes: secondes)

0
Oleksandr Potomkin

Essaye ça

public static void calculateTime(long seconds) {

int day = (int)TimeUnit.SECONDS.toDays(seconds);        
long hours = TimeUnit.SECONDS.toHours(seconds) ;

long tempSec = seconds - (TimeUnit.HOURS.toSeconds(hours) );
System.out.println("after hours calculation "+ tempSec);

long minute = TimeUnit.SECONDS.toMinutes(tempSec); 

if(tempSec > TimeUnit.MINUTES.toSeconds(minute)){
    tempSec = tempSec - (TimeUnit.MINUTES.toSeconds(minute) );          
}else{
    tempSec = TimeUnit.MINUTES.toSeconds(minute) - tempSec;
}
System.out.println("after min calculation "+ tempSec);


long second = TimeUnit.SECONDS.toSeconds(tempSec) ;

System.out.println("Day " + day + " Hour " + hours + " Minute " + minute + " Seconds " + second);
}
0
Sudhakar