Java'da zaman farkı nasıl hesaplanır?


99

İki zaman periyodunu 16:00:00 19:00:00 dan çıkarmak istiyorum. Bunun için herhangi bir java işlevi var mı? Sonuçlar milisaniye, saniye veya dakika cinsinden olabilir.


Yanıtlar:


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

Fark milisaniye cinsindendir.

Sfaizs gönderisini değiştirdim .


7
peki ya diğer yol? 16:00 - 19:00? Bunu nasıl hesaplayabilirim?
Alex Kapustian

Değişkenleri tersine çevirmek pek bir işe yaramayacaktır .. Bu örnekte, onları tersine çevirebilir ve mutlak değeri veya başka bir şey alabilirsiniz. Gece yarınız varsa (00:00) ne olur?
rj2700

1
Peki ya 23:15:00 - 01:15:00?
Oleksandr

bugün 08:00:00 ile dün 10:00:00 arasındaki fark ne olacak ??????? Önerdiğin şeyin kırılabilir bir mantık olduğunu sanmıyorum.
channae

119

Java 8'in daha temiz bir çözümü var - Anında ve Süre

Misal:

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

Cevabını gerçekten beğendim. Çok şık! :)
Avinash

Yani bu, iki içe aktarmaya ve System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));süreyi kaydetmeye indirgeniyor . Diğer diller bunu print("Duration: " + str(time.time()-start))... gibi bir kodla yapabiliyorsa, buna Java8'de güzel ve temiz bir çözüm demezdim ...
Luc

4
@Luc temizlik, kısalık ile aynı şey değildir. Java 8 sürümünde tam olarak ne olduğu çok daha nettir ve örneğin, iki an arasındaki süreyi milisaniye dışındaki bir birimde veya birden çok birim olarak bildirmek istiyorsanız (örneğin 1h 15m 3.022syerine 4503022 milliseconds) ince ayar yapmak çok daha kolaydır. .
JakeRobb

42

Güzel zamanlama farkları elde etmek için

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

gerçekten harika cevap
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();

1
Bu, Android için olduğu kadar Java SE 6 ve 7 için de arka bağlantı noktası olarak mevcuttur .
Bryan

11

Tıpkı diğer diller gibi; zaman dönemlerinizi bir unix zaman damgasına (yani Unix döneminden bu yana geçen saniyeler) dönüştürün ve sonra basitçe çıkarın. Ardından, ortaya çıkan saniyeler yeni bir unix zaman damgası olarak kullanılmalı ve istediğiniz formatta formatlanmalıdır.

Ah, yukarıdaki postere (genesiss) hakkını verin, kod her zaman kullanışlıdır;) Yine de, artık bir açıklamanız da var :)


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.

ve daha güzel bir biçimde göstermek için şunları kullanabilirsiniz:

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

Bu, başka bir cevabı kopyalar ve yeni içerik eklemez. Katkıda bulunacak yeni bir şeyiniz yoksa lütfen yanıt göndermeyin.
DavidPostill

@DavidPostill, bilginiz için teşekkürler. Ancak ihtiyacım olan ve GENESIS'in gönderisinde bulamadığım çözüm, iki kod satırının yürütülmesi arasındaki zaman farkıydı (programın başlangıç ​​noktası ve bitiş noktası gibi veya bir yöntemi çalıştırmadan önce ve sonra, statik zamanlar değil) . Bunun yardımcı olabileceğini düşündüm.
Alisa

3

Dönem ve Süre nesneleriyle en yaygın yaklaşımın yanı sıra, bilginizi Java'da zamanla başa çıkmanın başka bir yolu ile genişletebilirsiniz.

Gelişmiş Java 8 kitaplıkları. Farklılıklar için ChronoUnit .

ChronoUnit, iki Temporal değerin birbirinden ne kadar uzakta olduğunu belirlemenin harika bir yoludur. Temporal; LocalDate , LocalTime vb. İçerir .

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

İlk örnek, turlar yerine kesmeler arasında olduğunu gösterir.

İkincisi, farklı birimleri saymanın ne kadar kolay olduğunu gösterir.

Ve son örnek bize Java'da tarih ve saatlerle uğraşmamamız gerektiğini hatırlatıyor :)


2

Zahmetli yol, milise çevirmek ve çıkarma işlemini yapmak ve ardından istediğiniz saniyeye veya daha fazlasına geri dönmektir. Daha iyi bir yol JodaTime kullanmaktır .


1
Unix zaman damgalarından hiç bahsetmedim. Ayrıca Java Tarih ve Saat API'sinin ara sıra kullanımdan daha fazlası için berbat olduğu da iyi bilinen bir gerçektir. JodaTime çok daha iyi ve muhtemelen JSR 310 Java'nın bir parçası olana kadar gitmenin yolu. sourceforge.net/apps/mediawiki/threeten/…
Manfred Moser

@Manfred Moser: Olmalı ... Hem varsayılan Java zaman sınıfları hem de Joda, Unix dönemi denen şeyden başlayan milis cinsinden bir süre verir . Bu noktada, Unix zaman damgalarına yakın hale gelirler (biri milis, diğeri saniye cinsinden). Her durumda, OP'nin istediği şey, varsayılan Java sınıfları kullanılarak, Unix döneminden itibaren milisaniye sayısı alınarak ve bunları çıkararak önemsiz bir şekilde yapılabilir .
SözdizimiT3rr0r

1
Elbette önemsiz bir şekilde yapılabilir. Ve uygulamanızda çok sayıda tarih ve saat hesaplaması yaparsanız, kendiniz de önemsiz bir şekilde çok sayıda hata oluşturabilir ve JodaTime'ın parçalarını yeniden uygulayarak kendi küçük kitaplığınızı yeniden keşfedebilirsiniz. Uygun olabilecek basit bir hesaplama için, ancak sık kullanım için iyi bir kitaplık kullanmaya değer. Sadece ilk basit çözümün sizi en iyi yola götürmeyebileceğini belirtmeye çalışıyorum. Bunun derdi ne?
Manfred Moser

3
@Manfred Moser: Aslında, ilk basit bir çözüm olduğunu :) değil bir atom saati değişiklikleri, OP İki dönemin arasındaki farkın istedi dikkate doğru yol
Christian

Elbette .. sadece bu örnek ve belirli bir soru için. Büyük resim için değil.
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; 

Şimdi dakikalar, iki zaman arasındaki doğru süre (dakika olarak) olacaktır.


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

}


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

Ayrıştırma istisnalarını istisna tutamaçları atar


1

Farklı günlerden zaman alınırsa alternatif seçenek, örneğin: 22:00 ve 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

Bunu dene:

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

Bunu daha temiz buldum.

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

Çıktı : Alınan süre [0] saat: [0] dakika: [10] saniye


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
Bu kod soruyu yanıtlayabilirken, bu kodun soruyu neden ve / veya nasıl yanıtladığına ilişkin ek bağlam sağlamak , uzun vadeli değerini artırır.
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;
     }
}}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.