Як розрахувати різницю в часі в Java?


Відповіді:


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

Різниця в мілісекундах.

Я змінив пост sfaizs .


7
а як щодо іншого шляху? 16:00 - 19:00? Як я можу це обчислити?
Олексій Капустян

Інвертування змінних не принесе великої користі .. У цьому прикладі, звичайно, ви можете інвертувати їх і взяти абсолютне значення або щось інше. Але що станеться, якщо у вас опівночі (00:00)?
rj2700,

А як щодо 23:15:00 - 01:15:00?
Олександр

а як щодо різниці між 08:00:00 сьогодні і вчорашнім 10:00:00 ??????? Я не думаю, що те, що ви запропонували, є логічною логікою.
channae

105

Java 8 має більш чисте рішення - миттєве та тривале

Приклад:

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

Мені дуже сподобалась ваша відповідь. Дуже елегантно! :)
Авінаш

Отже, це зводиться до двох імпортів та System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));реєстрації тривалості. Я б не назвав це приємним і чистим рішенням у Java8, якщо інші мови можуть це робити за допомогою коду, такого як print("Duration: " + str(time.time()-start))...
Люк

3
@Luc чистота - це не те саме, що стислість. Набагато зрозуміліше, що саме відбувається у версії Java 8, а також набагато легше налаштувати, якщо, наприклад, ви хочете повідомити про тривалість між двома моментами в одиниці, крім мілісекунд, або як кілька одиниць (наприклад, 1h 15m 3.022sзамість 4503022 milliseconds) .
JakeRobb

40

ТО, щоб отримати гарні різниці у термінах

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

дійсно чудова відповідь
Паланівелрагул

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

1
Це також доступно для Java SE 6 і 7 як задній порт , а також для Android .
Брайан

11

Як і будь-яка інша мова; перетворіть свої періоди часу в мітку часу unix (тобто секунди з епохи Unix), а потім просто відніміть. Потім отримані секунди слід використовувати як нову мітку часу unix і читати, відформатовану в будь-якому бажаному форматі.

Ах, дайте вищезазначеному плакату (генезису) належне йому слово, код завжди зручний;) Хоча, тепер у вас також є пояснення :)


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.

і, щоб показати у приємнішому форматі, ви можете використовувати:

    DecimalFormat myDecimalFormatter = new DecimalFormat("###,###.###");
    System.out.println(myDecimalFormatter.format(((double)d2.getTime()-d1.getTime())/1000));

Це дублює іншу відповідь і не додає нового змісту. Будь ласка, не публікуйте відповіді, якщо у вас насправді немає чогось нового, щоб внести свій внесок.
DavidPostill

@DavidPostill, дякую за ваші голови. Але рішенням, яке я сам потребував і не знайшов у дописі GENESIS, була різниця в часі між виконанням двох рядків коду (як початкова точка та кінцева точка програми або до та після запуску методу, а не деякі статичні часи) . Я думав, це може допомогти.
Аліса

2

Болісний спосіб - конвертувати в міліси і зробити віднімання, а потім повернутись до тих секунд, які вам потрібно. Кращий спосіб - використовувати JodaTime .


1
Я ніколи не згадував мітки часу unix. Крім того, загальновідомим є той факт, що API дати та часу Java відмовляє більше ніж випадкове використання. JodaTime набагато кращий і, ймовірно, шлях, поки JSR 310 не стане частиною Java. sourceforge.net/apps/mediawiki/threeten/…
Манфред Мозер

@Manfred Moser: можливо, у вас має бути ... І часові класи Java за замовчуванням, і Joda дають час у мілісекундах, який починається з так званої епохи Unix . У цей момент вони стають чортовими наближеними до міток часу Unix (одна знаходиться в мілісекундах, інша - за секунди). У будь-якому випадку те, що хоче OP, може бути зроблено тривіально, використовуючи Java-класи за замовчуванням, беручи кількість мілісів з часів Unix і віднімаючи їх.
SyntaxT3rr0r

1
Звичайно, це можна зробити тривіально. І якщо ви робите багато обчислень дати та часу у своєму додатку, ви також можете тривіально створити багато помилок самостійно та заново створити власну маленьку бібліотеку, що реалізує частини JodaTime. Для одного простого розрахунку, який може бути нормальним, але для частого використання варто використовувати гідну бібліотеку. Я просто намагаюся зазначити, що перше просте рішення може не вести вас на найкращий шлях. Що з цим поганого?
Манфред Мозер

3
@ Манфред Мозер: Насправді першим простим рішенням є правильний шлях, враховуючи, що ОП вимагало різниці між двома періодами часу, а не зміною атомного годинника :)
Крістіан

Звичайно .. лише для цього прикладу та конкретного питання. Хоча не для загальної картини.
Манфред Мозер

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

викидає дескриптори винятків синтаксичного аналізу


2

Окрім найпоширенішого підходу до об'єктів Period і Duration, ви можете розширити свої знання іншим способом роботи з часом у Java.

Розширені бібліотеки Java 8. ChronoUnit для відмінностей.

ChronoUnit - це чудовий спосіб визначити відстань двох часових значень. До Temporal належать LocalDate , LocalTime тощо.

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

Перший приклад показує, що між усіками, а не раундами.

Другий показує, як легко порахувати різні одиниці.

І останній приклад нагадує нам, що ми не повинні возитися з датами та часом на Java :)


1

Альтернативний варіант, якщо береться час з різних днів, наприклад: 22:00 та 01:55.

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

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; 

Зараз хвилини будуть правильною тривалістю від двох разів (у хвилинах).


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

}


1

Спробуйте це:

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

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

} 

1

Я знайшов це більш чистим.

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

Вихід : час, зайнятий [0] годин: [0] хв: [10] секунд


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

2
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення.
Бенджамін В.

0

клас TimeCalculator {Рядок 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;
     }
}}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.