Bagaimana cara menghitung perbedaan waktu di java?


Jawaban:


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

Selisihnya dalam milidetik.

Saya mengubah posting sfaizs .


7
bagaimana dengan cara lain? 16:00 - 19:00? Bagaimana cara menghitung ini?
Alex Kapustian

Membalik variabel tidak akan banyak gunanya .. Dalam contoh ini, tentu, Anda bisa membalikkannya dan mengambil nilai absolut atau sesuatu. Tetapi apa yang terjadi jika Anda memiliki tengah malam (00:00)?
rj2700

Bagaimana dengan 23:15:00 - 01:15:00?
Oleksandr

bagaimana dengan perbedaan antara 08:00:00 hari ini dan kemarin 10:00:00 ??????? Saya tidak berpikir apa yang Anda sarankan adalah logika yang bisa dipecahkan.
channae

105

Java 8 memiliki solusi yang lebih bersih - Instan dan Durasi

Contoh:

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

Saya sangat menyukai jawaban Anda. Sangat elegan! :)
Avinash

Jadi ini bermuara pada dua impor dan System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));mencatat durasi. Saya tidak akan menyebut itu solusi yang bagus dan bersih di Java8 jika bahasa lain dapat melakukannya dengan kode seperti print("Duration: " + str(time.time()-start))...
Luc

3
Kebersihan @Luc tidak sama dengan singkatnya. Jauh lebih jelas apa yang terjadi di versi Java 8, dan juga jauh lebih mudah untuk menyesuaikan jika, misalnya, Anda ingin melaporkan durasi antara dua instans dalam satu unit selain milidetik, atau sebagai beberapa unit (mis. 1h 15m 3.022sAlih-alih 4503022 milliseconds) .
JakeRobb

40

UNTUK mendapatkan perbedaan waktu yang cukup, lalu

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

jawaban yang sangat bagus
Palanivelraghul

32

Jawa 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
Ini juga tersedia untuk Java SE 6 dan 7 sebagai port belakang , serta untuk Android .
Bryan

11

Sama seperti bahasa lainnya; ubah periode waktu Anda menjadi stempel waktu unix (yaitu, detik sejak periode Unix) dan kemudian kurangi. Kemudian, detik yang dihasilkan harus digunakan sebagai stempel waktu unix baru dan dibaca dalam format apa pun yang Anda inginkan.

Ah, berikan poster di atas (genesiss) kreditnya, kodenya selalu berguna;) Meskipun, Anda sekarang memiliki penjelasan juga :)


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.

dan, untuk menampilkan dalam format yang lebih bagus, Anda dapat menggunakan:

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

Ini menduplikasi jawaban lain dan tidak menambahkan konten baru. Harap jangan memposting jawaban kecuali Anda benar-benar memiliki sesuatu yang baru untuk disumbangkan.
DavidPostill

@DavidPostill, terima kasih atas perhatian Anda. Tetapi solusi yang saya butuhkan dan tidak saya temukan di posting GENESIS adalah perbedaan waktu antara eksekusi dua baris kode (seperti titik awal dan titik akhir program atau sebelum dan sesudah menjalankan metode, bukan waktu statis) . Saya pikir ini dapat membantu.
Alisa

2

Cara yang menyakitkan adalah mengonversi ke milis dan melakukan pengurangan lalu kembali ke detik apa pun yang Anda inginkan. Cara yang lebih baik adalah menggunakan JodaTime .


1
Saya tidak pernah menyebutkan cap waktu unix. Juga merupakan fakta yang terkenal bahwa Java Date and Time API menyedot lebih dari penggunaan sesekali. JodaTime jauh lebih baik dan mungkin cara untuk melanjutkan hingga JSR 310 adalah bagian dari Java. sourceforge.net/apps/mediawiki/threeten/…
Manfred Moser

@Manfred Moser: mungkin Anda harus memiliki ... Baik kelas waktu default Java dan Joda memberikan waktu dalam milidetik yang dimulai dari apa yang disebut zaman Unix . Pada titik ini mereka menjadi sangat dekat dengan cap waktu Unix (satu dalam milis, yang lain dalam detik). Dalam kasus apa pun yang diinginkan OP dapat dilakukan dengan mudah menggunakan kelas Java default, mengambil jumlah milis sejak zaman Unix dan menguranginya.
SyntaxT3rr0r

1
Yakin itu bisa dilakukan dengan sepele. Dan jika Anda melakukan banyak penghitungan tanggal dan waktu di aplikasi Anda, Anda juga dapat membuat banyak bug sendiri dan menemukan kembali perpustakaan kecil Anda sendiri yang menerapkan bagian JodaTime sendiri lagi. Untuk satu kalkulasi sederhana yang mungkin baik-baik saja tetapi untuk penggunaan yang sering ada baiknya menggunakan perpustakaan yang layak. Saya hanya mencoba menunjukkan bahwa solusi sederhana pertama mungkin tidak menuntun Anda ke jalan terbaik. Apa yang salah dengan itu?
Manfred Moser

3
@Manfred Moser: Sebenarnya, solusi sederhana pertama adalah jalan yang benar, mengingat OP meminta perbedaan antara dua periode waktu, bukan perubahan jam atom :)
Christian

Tentu .. untuk contoh ini dan pertanyaan khusus saja. Bukan untuk gambaran yang lebih besar.
Manfred Moser

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

Sekarang menit akan menjadi durasi yang benar antara dua waktu (dalam menit).


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

throws exception menangani pengecualian parsing


2

Selain pendekatan paling umum dengan objek Periode dan Durasi, Anda dapat memperluas pengetahuan Anda dengan cara lain untuk menangani waktu di Java.

Perpustakaan Java 8 tingkat lanjut. ChronoUnit untuk Perbedaan.

ChronoUnit adalah cara yang bagus untuk menentukan seberapa jauh jarak dua nilai Temporal. Temporal termasuk LOCALDATE , localtime dan sebagainya.

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

Contoh pertama menunjukkan bahwa antara pemotongan bukan putaran.

Yang kedua menunjukkan betapa mudahnya menghitung satuan yang berbeda.

Dan contoh terakhir mengingatkan kita bahwa kita tidak boleh mengacaukan tanggal dan waktu di Java :)


1

Pilihan alternatif jika mengambil waktu dari hari yang berbeda, misalnya: 22:00 dan 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
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

Coba ini:

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

Saya menemukan ini lebih bersih.

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

Output : Waktu yang dibutuhkan [0] jam: [0] menit: [10] detik


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
Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan tersebut meningkatkan nilai jangka panjangnya.
Benjamin W.

0

kelas 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;
     }
}}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.