Comment calculer le décalage horaire en Java?

95

Je veux soustraire deux périodes de temps, disons 16:00:00 de 19:00:00. Existe-t-il une fonction Java pour cela? Les résultats peuvent être en millisecondes, secondes ou minutes.

user607304
la source
5
probablement joda-time.sourceforge.net
stacker

Réponses:

116
String time1 = "16:00:00";
String time2 = "19:00:00";

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
Date date1 = format.parse(time1);
Date date2 = format.parse(time2);
long difference = date2.getTime() - date1.getTime(); 

La différence est en millisecondes.

J'ai modifié le message de sfaizs .

Uros K
la source
7
qu'en est-il de l'autre façon? 16h00 - 19h00? Comment puis-je calculer cela?
Alex Kapustian
Inverser les variables ne fera pas grand-chose. Dans cet exemple, bien sûr, vous pouvez les inverser et prendre la valeur absolue ou quelque chose. Mais que se passe-t-il si vous avez minuit (00h00)?
rj2700
Qu'en est-il de 23:15:00 - 01:15:00?
Oleksandr
qu'en est-il de la différence entre 08:00:00 aujourd'hui et 10:00:00 d'hier ??????? Je ne pense pas que ce que vous suggérez soit une logique cassable.
channae
105

Java 8 a une solution plus propre - Instantanée et Durée

Exemple:

import java.time.Duration;
import java.time.Instant;
...
Instant start = Instant.now();
//your code
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
System.out.println("Time taken: "+ timeElapsed.toMillis() +" milliseconds");
Anila Sebastian
la source
J'ai vraiment aimé ta réponse. Très élégant! :)
Avinash
Cela se résume donc à deux importations et System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));à enregistrer la durée. Je n'appellerais pas cela une solution agréable et propre en Java8 si d'autres langages peuvent le faire avec du code comme print("Duration: " + str(time.time()-start))...
Luc
3
La propreté @Luc n'est pas la même chose que la brièveté. Ce qui se passe exactement dans la version Java 8 est beaucoup plus clair, et il est également beaucoup plus facile de modifier si, par exemple, vous souhaitez rapporter la durée entre deux instants dans une unité autre que les millisecondes, ou sous forme d'unités multiples (par exemple 1h 15m 3.022sau lieu de 4503022 milliseconds) .
JakeRobb
40

POUR obtenir de jolies différences de timing, alors

// d1, d2 are dates
long diff = d2.getTime() - d1.getTime();

long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffDays = diff / (24 * 60 * 60 * 1000);

System.out.print(diffDays + " days, ");
System.out.print(diffHours + " hours, ");
System.out.print(diffMinutes + " minutes, ");
System.out.print(diffSeconds + " seconds.");
Fizer Khan
la source
vraiment bonne réponse
Palanivelraghul
32

Java 8

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

LocalDateTime dateTime1= LocalDateTime.parse("2014-11-25 19:00:00", formatter);
LocalDateTime dateTime2= LocalDateTime.parse("2014-11-25 16:00:00", formatter);

long diffInMilli = java.time.Duration.between(dateTime1, dateTime2).toMillis();
long diffInSeconds = java.time.Duration.between(dateTime1, dateTime2).getSeconds();
long diffInMinutes = java.time.Duration.between(dateTime1, dateTime2).toMinutes();
Alex B
la source
1
Ceci est également disponible pour Java SE 6 et 7 en tant que port arrière , ainsi que pour Android .
Bryan
11

Comme toute autre langue; convertissez vos périodes de temps en un horodatage Unix (c'est-à-dire, secondes depuis l'époque Unix), puis soustrayez simplement. Ensuite, les secondes résultantes doivent être utilisées comme un nouvel horodatage unix et lues formatées dans le format souhaité.

Ah, donnez à l'affiche ci-dessus (genesiss) son crédit, le code est toujours à portée de main;) Cependant, vous avez maintenant une explication :)

Christian
la source
8
import java.util.Date;
...
Date d1 = new Date();
...
...
Date d2 = new Date();
System.out.println(d2.getTime()-d1.getTime()); //gives the time difference in milliseconds. 
System.out.println((d2.getTime()-d1.getTime())/1000); //gives the time difference in seconds.

et, pour afficher dans un format plus agréable, vous pouvez utiliser:

    DecimalFormat myDecimalFormatter = new DecimalFormat("###,###.###");
    System.out.println(myDecimalFormatter.format(((double)d2.getTime()-d1.getTime())/1000));
Alisa
la source
Cela duplique une autre réponse et n'ajoute aucun nouveau contenu. Veuillez ne pas publier de réponse à moins que vous n'ayez quelque chose de nouveau à apporter.
DavidPostill
@DavidPostill, merci pour votre attention. Mais la solution dont j'avais besoin de moi-même et que je n'ai pas trouvée dans le post de GENESIS était le décalage horaire entre l'exécution de deux lignes de code (comme le point de départ et le point de fin du programme ou avant et après l'exécution d'une méthode, pas des temps statiques) . J'ai pensé que cela pourrait aider.
Alisa
2

La manière douloureuse est de convertir en millis et de faire la soustraction, puis de revenir à quelques secondes environ. La meilleure façon est d'utiliser JodaTime .

Manfred Moser
la source
1
Je n'ai jamais mentionné les horodatages Unix. C'est également un fait bien connu que l'API Java Date and Time est nul pour une utilisation plus qu'occasionnelle. JodaTime est bien meilleur et probablement la voie à suivre jusqu'à ce que JSR 310 fasse partie de Java. sourceforge.net/apps/mediawiki/threeten/…
Manfred Moser
@Manfred Moser: vous devriez peut-être ... Les classes de temps Java par défaut et Joda donnent une heure en millis qui part de ce qu'on appelle l' époque Unix . À ce stade, ils deviennent très proches des horodatages Unix (l'un étant en millis, l'autre en secondes). Dans tous les cas, ce que l'OP veut peut être fait de manière triviale en utilisant les classes Java par défaut, en prenant le nombre de millis depuis l' époque Unix et en les soustrayant.
SyntaxeT3rr0r
1
Bien sûr, cela peut être fait de manière triviale. Et si vous faites beaucoup de calculs de date et d'heure dans votre application, vous pouvez également créer vous-même de nombreux bogues et réinventer votre propre petite bibliothèque en implémentant à nouveau des parties de JodaTime. Pour un calcul simple, cela peut convenir, mais pour une utilisation fréquente, il vaut la peine d'utiliser une bibliothèque décente. J'essaie juste de souligner que la première solution simple pourrait ne pas vous conduire sur la meilleure voie. Qu'est-ce qui ne va pas avec ça?
Manfred Moser
3
@Manfred Moser: En fait, la première solution simple est le bon chemin, étant donné que l'OP a demandé la différence entre deux périodes de temps, pas les changements d'une horloge atomique :)
Christian
Bien sûr .. pour cet exemple et question spécifique uniquement. Pas pour une vue d'ensemble cependant.
Manfred Moser
2
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) throws Exception{
    String time1 = "12:00:00";
    String time2 = "12:01:00";
    SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
    Date date1 = format.parse(time1);
    Date date2 = format.parse(time2);
    long difference = date2.getTime() - date1.getTime();
    System.out.println(difference/1000);
}}

lève l'exception gère l'analyse des exceptions

Sushmidha Sakthiveeran
la source
2

Outre l'approche la plus courante avec les objets Période et Durée, vous pouvez élargir vos connaissances avec une autre façon de gérer le temps en Java.

Bibliothèques Java 8 avancées. ChronoUnit pour les différences.

ChronoUnit est un excellent moyen de déterminer la distance entre deux valeurs temporelles. Temporal inclut LocalDate , LocalTime et ainsi de suite.

LocalTime one = LocalTime.of(5,15);
LocalTime two = LocalTime.of(6,30);
LocalDate date = LocalDate.of(2019, 1, 29);

System.out.println(ChronoUnit.HOURS.between(one, two)); //1
System.out.println(ChronoUnit.MINUTES.between(one, two)); //75
System.out.println(ChronoUnit.MINUTES.between(one, date)); //DateTimeException

Le premier exemple montre qu'entre les tronçons plutôt que les arrondis.

La seconde montre à quel point il est facile de compter différentes unités.

Et le dernier exemple nous rappelle qu'il ne faut pas jouer avec les dates et les heures en Java :)

Alexandre
la source
1

Une option alternative si l'heure de différents jours est prise, par exemple: 22h00 et 01h55.

public static long getDiffTime(Date date1, Date date2){
        if (date2.getTime() - date1.getTime() < 0) {// if for example date1 = 22:00, date2 = 01:55.
            Calendar c = Calendar.getInstance();
            c.setTime(date2);
            c.add(Calendar.DATE, 1);
            date2 = c.getTime();
        } //else for example date1 = 01:55, date2 = 03:55.
        long ms = date2.getTime() - date1.getTime();

        //235 minutes ~ 4 hours for (22:00 -- 01:55).
        //120 minutes ~ 2 hours for (01:55 -- 03:55).
        return TimeUnit.MINUTES.convert(ms, TimeUnit.MILLISECONDS);
    }
user3541830
la source
1
String start = "12:00:00";
String end = "02:05:00";

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); 

Date date1 = format.parse(start);

Date date2 = format.parse(end);

long difference = date2.getTime() - date1.getTime(); 

int minutes = (int) TimeUnit.MILLISECONDS.toMinutes(difference);

if(minutes<0)minutes += 1440; 

Maintenant, les minutes seront la durée correcte entre deux heures (en minutes).

Md. Rayhanuzzaman Roky
la source
1
public class timeDifference {

public static void main(String[] args) {

    try {

        Date startTime = Calendar.getInstance().getTime();
        Thread.sleep(10000);
        Date endTime = Calendar.getInstance().getTime();

        long difference = endTime.getTime() - startTime.getTime();

        long differenceSeconds = difference / 1000 % 60;
        long differenceMinutes = difference / (60 * 1000) % 60;
        long differenceHours = difference / (60 * 60 * 1000) % 24;
        long differenceDays = difference / (24 * 60 * 60 * 1000);

        System.out.println(differenceDays + " days, ");
        System.out.println(differenceHours + " hours, ");
        System.out.println(differenceMinutes + " minutes, ");
        System.out.println(differenceSeconds + " seconds.");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

Dinesh
la source
1

Essaye ça:

public String timeDifference8(String startTime, String endTime) {
    LocalTime initialTime = LocalTime.parse(startTime);
    LocalTime finalTime =LocalTime.parse(endTime);
    StringJoiner joiner = new StringJoiner(":");
    long hours = initialTime.until( finalTime, ChronoUnit.HOURS);
    initialTime = initialTime.plusHours( hours );
    long minutes = initialTime.until(finalTime, ChronoUnit.MINUTES);
    initialTime = initialTime.plusMinutes( minutes );
    long seconds = initialTime.until( finalTime, ChronoUnit.SECONDS);
    joiner.add(String.valueOf(hours));
    joiner.add(String.valueOf(minutes));
    joiner.add(String.valueOf(seconds));
    return joiner.toString();
}
Bhavish Salian
la source
1
import java.sql.*;

class Time3 {

    public static void main(String args[]){ 
        String time1 = "01:03:23";
        String time2 = "02:32:00";
        long difference ;
        Time t1 = Time.valueOf(time1);
        Time t2 = Time.valueOf(time2);
        if(t2.getTime() >= t1.getTime()){
            difference = t2.getTime() - t1.getTime() -19800000;
        }
        else{
            difference = t1.getTime() - t2.getTime() -19800000;
        }

        java.sql.Time time = new java.sql.Time(difference); 
        System.out.println(time);
    } 

} 
tharsikan
la source
1

J'ai trouvé cela plus propre.

       Date start = new Date();
        //Waiting for 10 seconds
        Thread.sleep(10000);
        Date end = new Date();
        long diff = end.getTime() - start.getTime();
        String TimeTaken = String.format("[%s] hours : [%s] mins : [%s] secs",
                Long.toString(TimeUnit.MILLISECONDS.toHours(diff)), 
                TimeUnit.MILLISECONDS.toMinutes(diff),
                TimeUnit.MILLISECONDS.toSeconds(diff));
        System.out.println(String.format("Time taken %s", TimeTaken));

Sortie : Temps pris [0] heures: [0] min: [10] s

Amit Shakya
la source
0
    /*
 * Total time calculation.
 */
private void getTotalHours() {
    try {
        // TODO Auto-generated method stub
        if (tfTimeIn.getValue() != null && tfTimeOut.getValue() != null) {
            Long min1 = tfTimeOut.getMinutesValue();
            Long min2 = tfTimeIn.getMinutesValue();
            Long hr1 = tfTimeOut.getHoursValue();
            Long hr2 = tfTimeIn.getHoursValue();
            Long hrsTotal = new Long("0");
            Long minTotal = new Long("0");
            if ((hr2 - hr1) == 1) {
                hrsTotal = (long) 1;
                if (min1 != 0 && min2 == 0) {
                    minTotal = (long) 60 - min1;
                } else if (min1 == 0 && min2 != 0) {
                    minTotal = min2;
                } else if (min1 != 0 && min2 != 0) {
                    minTotal = min2;
                    Long minOne = (long) 60 - min1;
                    Long minTwo = min2;
                    minTotal = minOne + minTwo;
                }
                if (minTotal >= 60) {
                    hrsTotal++;
                    minTotal = minTotal % 60;
                }
            } else if ((hr2 - hr1) > 0) {
                hrsTotal = (hr2 - hr1);
                if (min1 != 0 && min2 == 0) {
                    minTotal = (long) 60 - min1;
                } else if (min1 == 0 && min2 != 0) {
                    minTotal = min2;
                } else if (min1 != 0 && min2 != 0) {
                    minTotal = min2;
                    Long minOne = (long) 60 - min1;
                    Long minTwo = min2;
                    minTotal = minOne + minTwo;
                }
                if (minTotal >= 60) {
                    minTotal = minTotal % 60;
                }
            } else if ((hr2 - hr1) == 0) {
                if (min1 != 0 || min2 != 0) {
                    if (min2 > min1) {
                        hrsTotal = (long) 0;
                        minTotal = min2 - min1;
                    } else {
                        Notification.show("Enter A Valid Time");
                        tfTotalTime.setValue("00.00");
                    }
                }
            } else {
                Notification.show("Enter A Valid Time");
                tfTotalTime.setValue("00.00");
            }
            String hrsTotalString = hrsTotal.toString();
            String minTotalString = minTotal.toString();
            if (hrsTotalString.trim().length() == 1) {
                hrsTotalString = "0" + hrsTotalString;
            }
            if (minTotalString.trim().length() == 1) {
                minTotalString = "0" + minTotalString;
            }
            tfTotalTime.setValue(hrsTotalString + ":" + minTotalString);
        } else {
            tfTotalTime.setValue("00.00");
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

la source
2
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la raison et / ou la manière dont ce code répond à la question améliore sa valeur à long terme.
Benjamin W.
0

class TimeCalculator {String updateTime;

     public TimeCalculator(String time)
      {
        // time should be in 24 hours format like 15/06/2016 17:39:20  
        this.updateTime = time;
      }

     public String getTimeDifference()
     {
        String td=null;
       // get Current Time
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
        Date currentDate = new Date();
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(currentDate);

        int c_year = calendar.get(Calendar.YEAR);
        int c_month = calendar.get(Calendar.MONTH) + 1;
        int c_day = calendar.get(Calendar.DAY_OF_MONTH);

        // get Editing Time

        Date edit_date = sdf.parse(updateTime);
        Calendar edit_calendar = new GregorianCalendar();
        edit_calendar.setTime(edit_date);

        int e_year = edit_calendar.get(Calendar.YEAR);
        int e_month = edit_calendar.get(Calendar.MONTH) + 1;
        int e_day = edit_calendar.get(Calendar.DAY_OF_MONTH);


        if(e_year==c_year&&e_month==c_month&&e_day==c_day)
            {

             int c_hours = calendar.get(Calendar.HOUR_OF_DAY);
             int c_minutes = calendar.get(Calendar.MINUTE);
             int c_seconds = calendar.get(Calendar.SECOND);

             int e_hours = edit_calendar.get(Calendar.HOUR_OF_DAY);
             int e_minutes = edit_calendar.get(Calendar.MINUTE);
             int e_seconds = edit_calendar.get(Calendar.SECOND);

      if(c_hours==e_hours&&c_minutes==e_minutes&&c_seconds==e_seconds)
         {
           td = "just now";
           return td;
          }
      else if(c_hours==e_hours&&c_minutes==e_minutes)
       {
         int d_seconds = c_seconds-e_seconds;
         td = String.valueOf(d_seconds);
         td = td+" seconds ago";
         return td;
       }
      else if(c_hours==e_hours&&c_minutes!=e_minutes)
       {
         int d_minutes = c_minutes-e_minutes;
         int d_seconds;
         if(c_seconds>e_seconds)
           {
             d_seconds = c_seconds-e_seconds;
           }else{
             d_seconds = e_seconds-c_seconds;
       }
          td = "00:"+String.valueOf(d_minutes)+":"+String.valueOf(d_seconds)+" ago";
        return td;
  }
    else
       {
        int d_minutes,d_seconds,d_hours;
        d_hours=c_hours-e_hours;
        if(c_minutes>e_minutes)
       {
         d_minutes = c_minutes-e_minutes;
       }else{
         d_minutes = e_minutes-c_minutes;
       }
        if(c_seconds>e_seconds)
          {
            d_seconds = c_seconds-e_seconds;
          }else{
            d_seconds = e_seconds-c_seconds;
          }

      td = String.valueOf(d_hours)+":"+String.valueOf(d_minutes)+":"+String.valueOf(d_seconds)+" ago";
     return td;
  }
}
 else if(e_year==c_year&&e_month==c_month&&c_day==e_day+1){
   td = "yesterday";
   return td;
 }
 else{
    td = updateTime;
    return td;
     }
}}
Prashant Kumar
la source