Java'da iki tarih arasındaki farkın süresi nasıl bulunur?


103

İki DateTime nesnem varFarklarının süresini bulması gereken ,

Aşağıdaki koda sahibim, ancak aşağıdaki gibi beklenen sonuçlara ulaşmak için nasıl devam edeceğimi bilmiyorum:

Misal

      11/03/14 09:30:58
      11/03/14 09:33:43
      elapsed time is 02 minutes and 45 seconds
      -----------------------------------------------------
      11/03/14 09:30:58 
      11/03/15 09:30:58
      elapsed time is a day
      -----------------------------------------------------
      11/03/14 09:30:58 
      11/03/16 09:30:58
      elapsed time is two days
      -----------------------------------------------------
      11/03/14 09:30:58 
      11/03/16 09:35:58
      elapsed time is two days and 05 mintues

Kod

    String dateStart = "11/03/14 09:29:58";
    String dateStop = "11/03/14 09:33:43";

    Custom date format
    SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd HH:mm:ss");

    Date d1 = null;
    Date d2 = null;
    try {
        d1 = format.parse(dateStart);
        d2 = format.parse(dateStop);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    // Get msec from each, and subtract.
    long diff = d2.getTime() - d1.getTime();
    long diffSeconds = diff / 1000 % 60;
    long diffMinutes = diff / (60 * 1000) % 60;
    long diffHours = diff / (60 * 60 * 1000);
    System.out.println("Time in seconds: " + diffSeconds + " seconds.");
    System.out.println("Time in minutes: " + diffMinutes + " minutes.");
    System.out.println("Time in hours: " + diffHours + " hours.");

5
Lütfen bunun için yerleşik destek sağlayan Joda zamanına bir göz atın.
Erik Pragt

1
kodunuzda ne sorun var, gerekli çıktıyı elde etmek için sadece birkaç ince
ayar yapmanız

Önce saat cinsinden farkı bulun, kalanla farkı dakika ve sonra saniye cinsinden bulun!
NINCOMPOOP

1
@PeterLawrey Farklı örnekler
verdim

1
@question duplication, aynı sonuçları bekleyen iki soru anlamına gelir, bu sorunun beklenen çıktısı sağladığınızdan farklıdır.
Tim Norman

Yanıtlar:


68

takip etmeyi dene

{
        Date dt2 = new DateAndTime().getCurrentDateTime();

        long diff = dt2.getTime() - dt1.getTime();
        long diffSeconds = diff / 1000 % 60;
        long diffMinutes = diff / (60 * 1000) % 60;
        long diffHours = diff / (60 * 60 * 1000);
        int diffInDays = (int) ((dt2.getTime() - dt1.getTime()) / (1000 * 60 * 60 * 24));

        if (diffInDays > 1) {
            System.err.println("Difference in number of days (2) : " + diffInDays);
            return false;
        } else if (diffHours > 24) {

            System.err.println(">24");
            return false;
        } else if ((diffHours == 24) && (diffMinutes >= 1)) {
            System.err.println("minutes");
            return false;
        }
        return true;
}

20
Bu cevap, günlerin başlangıcını ve bitişini tanımlayan zaman dilimlerini göz ardı eder. Bu yanıt, Gün Işığından Yararlanma Saatini ve bir günün her zaman 24 saat uzunluğunda olmadığı anlamına gelen diğer anormallikleri göz ardı eder. Joda-Time veya java.time kitaplıklarını kullanan doğru yanıtlara bakın.
Basil Bourque

3
Basil'in işaret ettiği gibi, bu cevap yanlıştır. Bitiş tarihi yaz saati uygulaması sırasında meydana gelirse, ancak başlangıç ​​tarihi gelmezse yanlış sayıda gün verir.
Dawood ibn Kareem

191

Tarih farkı dönüşümü, Java yerleşik sınıfı TimeUnit kullanılarak daha iyi bir şekilde ele alınabilir . Bunu yapmak için yardımcı yöntemler sağlar:

Date startDate = // Set start date
Date endDate   = // Set end date

long duration  = endDate.getTime() - startDate.getTime();

long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);

2
Alternatif olarak uzun diffInSeconds = TimeUnit.SECONDS.convert (süre, TimeUnit.MILLSECONDS);
gerardw

3
Bu en iyi cevap.
Angel Cuenca

2
Ben bu hareketi ikinciyim; Bu cevap en iyisidir.
Duygusal

3
3. parti kitaplığa bağımlılık yok.
crmepham

Merhaba, öncelikle kısa ve güzel cevabınız için çok teşekkür ederim, çözümünüzde iki tarihim var 06_12_2017_07_18_02_PM ve diğeri 06_12_2017_07_13_16_PM gibi bir sorunla karşılaşıyorum, bunun yerine 286 saniye alıyorum, bunun yerine sadece 46 saniye
almalıyım

44

Joda-Time kitaplığını kullanın

DateTime startTime, endTime;
Period p = new Period(startTime, endTime);
long hours = p.getHours();
long minutes = p.getMinutes();

Joda Time, zaman aralığı kavramına sahiptir:

Interval interval = new Interval(oldTime, new Instant());

Bir örnek daha Tarih Farkı

Bir Bağlantı Daha

veya Java-8 ile (entegre Joda-Time konseptleri)

Instant start, end;//
Duration dur = Duration.between(start, stop);
long hours = dur.toHours();
long minutes = dur.toMinutes();

2
Kabul edilen cevap bu olmalıdır. Joda zamanı gitmenin yolu
Bizmarck

Doğru saat dilimlerini, gün ışığı değişikliklerini vb.
İşlemenin

Sadece küçük bir yazım hatası: 2. satırınızda "dur" değil "son" demek istediniz ("Süre dur = Duration.between (start, stop);").
Mohamad Fakih

12

İşte shamimz'in cevabı gibi Java 8'de de problem nasıl çözülebilir.

Kaynak: http://docs.oracle.com/javase/tutorial/datetime/iso/period.html

LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1960, Month.JANUARY, 1);

Period p = Period.between(birthday, today);
long p2 = ChronoUnit.DAYS.between(birthday, today);

System.out.println("You are " + p.getYears() + " years, " + p.getMonths() + " months, and " + p.getDays() + " days old. (" + p2 + " days total)");

Kod, aşağıdakine benzer çıktı üretir:

You are 53 years, 4 months, and 29 days old. (19508 days total)

Saat, dakika, saniye farklarını elde etmek için LocalDateTime http://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html'yi kullanmalıyız .


MayurB'nin yanıtladığı şekliyle Joda-Time yöntemine çok benziyor. joda-time.sourceforge.net
johnkarka

1
Joda-Time ile bağlantınız eski. Mevcut URL şu şekildedir
Basil Bourque

LocalDate, zamanı ve saat dilimini depolamıyor. Sadece gün-ay-yıl tutar. bkz. docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
Shamim

Bu, zamanı dikkate almaz. OP'nin sorusu saniyeler, dakikalar ve saatler içeriyordu.
mkobit

7
Date d2 = new Date();
Date d1 = new Date(1384831803875l);

long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000);
int diffInDays = (int) diff / (1000 * 60 * 60 * 24);

System.out.println(diffInDays+"  days");
System.out.println(diffHours+"  Hour");
System.out.println(diffMinutes+"  min");
System.out.println(diffSeconds+"  sec");

Merhaba, öncelikle kısa ve güzel cevabınız için çok teşekkür ederim, çözümünüzde iki tarihim var 06_12_2017_07_18_02_PM ve diğeri 06_12_2017_07_13_16_PM gibi bir sorunla karşı karşıyayım, bunun yerine 286 saniye alıyorum, bunun yerine sadece 46 saniye
almalıyım

6

Gibi bir yöntem oluşturabilirsiniz

public long getDaysBetweenDates(Date d1, Date d2){
return TimeUnit.MILLISECONDS.toDays(d1.getTime() - d2.getTime());
}

Bu yöntem, 2 gün arasındaki gün sayısını döndürecektir.


5

Michael Borgwardt'ın burada cevabında yazdığı gibi :

int diffInDays = (int)( (newerDate.getTime() - olderDate.getTime()) 
                 / (1000 * 60 * 60 * 24) )

Bunun UTC tarihleriyle çalıştığını unutmayın, bu nedenle yerel tarihlere bakarsanız fark bir gün izinli olabilir. Ve yerel tarihlerle doğru bir şekilde çalışmasını sağlamak, gün ışığından yararlanma süresi nedeniyle tamamen farklı bir yaklaşım gerektirir.


1
Bu değeri manuel olarak çarpmak iyi bir fikir değildir. Bunun yerine java TimeUnit sınıfını kullanın.
Shamim Ahmmed

2
Yerel tarihlerle ilgili söyledikleriniz doğru değil. API doc'a göre getTime () yöntemi Bu Date nesnesi tarafından temsil edilen 1 Ocak 1970 00:00:00 GMT'den bu yana geçen milisaniye sayısını döndürür. İki sayı aynı birime sahipse, bunları eklemek ve çıkarmak güvenlidir.
Ingo

1
Evet. Güvenlidir, ancak kod temiz değildir, çünkü java bunu halletmek için standart bir yol sağlar.
Shamim Ahmmed

1
Bir cevaba bağlantı sağlamaya ek olarak, başkalarından kopyaladığınız ifadeleri açıkça alıntı yapmalısınız.
Brad Larson

3

Java 8'de, size yapabilir DateTimeFormatter, Durationve LocalDateTime. İşte bir örnek:

final String dateStart = "11/03/14 09:29:58";
final String dateStop = "11/03/14 09:33:43";

final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.MONTH_OF_YEAR, 2)
        .appendLiteral('/')
        .appendValue(ChronoField.DAY_OF_MONTH, 2)
        .appendLiteral('/')
        .appendValueReduced(ChronoField.YEAR, 2, 2, 2000)
        .appendLiteral(' ')
        .appendValue(ChronoField.HOUR_OF_DAY, 2)
        .appendLiteral(':')
        .appendValue(ChronoField.MINUTE_OF_HOUR, 2)
        .appendLiteral(':')
        .appendValue(ChronoField.SECOND_OF_MINUTE, 2)
        .toFormatter();

final LocalDateTime start = LocalDateTime.parse(dateStart, formatter);
final LocalDateTime stop = LocalDateTime.parse(dateStop, formatter);

final Duration between = Duration.between(start, stop);

System.out.println(start);
System.out.println(stop);
System.out.println(formatter.format(start));
System.out.println(formatter.format(stop));
System.out.println(between);
System.out.println(between.get(ChronoUnit.SECONDS));

3

Benim için çalıştı, bununla deneyebilirsin, umarım yardımcı olur. Herhangi bir endişeniz varsa bana bildirin.

Date startDate = java.util.Calendar.getInstance().getTime(); //set your start time
Date endDate = java.util.Calendar.getInstance().getTime(); // set  your end time

long duration = endDate.getTime() - startDate.getTime();


long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);

Toast.makeText(MainActivity.this, "Diff"
        + duration + diffInDays + diffInHours + diffInMinutes + diffInSeconds, Toast.LENGTH_SHORT).show(); **// Toast message for android .**

System.out.println("Diff" + duration + diffInDays + diffInHours + diffInMinutes + diffInSeconds); **// Print console message for Java .**

1
long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds (süre);
Keshav Gera

2

Kod bu:

        String date1 = "07/15/2013";
        String time1 = "11:00:01";
        String date2 = "07/16/2013";
        String time2 = "22:15:10";
        String format = "MM/dd/yyyy HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date fromDate = sdf.parse(date1 + " " + time1);
        Date toDate = sdf.parse(date2 + " " + time2);

        long diff = toDate.getTime() - fromDate.getTime();
        String dateFormat="duration: ";
        int diffDays = (int) (diff / (24 * 60 * 60 * 1000));
        if(diffDays>0){
            dateFormat+=diffDays+" day ";
        }
        diff -= diffDays * (24 * 60 * 60 * 1000);

        int diffhours = (int) (diff / (60 * 60 * 1000));
        if(diffhours>0){
            dateFormat+=diffhours+" hour ";
        }
        diff -= diffhours * (60 * 60 * 1000);

        int diffmin = (int) (diff / (60 * 1000));
        if(diffmin>0){
            dateFormat+=diffmin+" min ";
        }
        diff -= diffmin * (60 * 1000);

        int diffsec = (int) (diff / (1000));
        if(diffsec>0){
            dateFormat+=diffsec+" sec";
        }
        System.out.println(dateFormat);

ve çıkış:

duration: 1 day 11 hour 15 min 9 sec

2

Shamim'in cevap güncellemesine referansla, burada herhangi bir üçüncü taraf kitaplığı kullanmadan görevi yapan bir yöntem var. Sadece yöntemi kopyalayın ve kullanın

public static String getDurationTimeStamp(String date) {

        String timeDifference = "";

        //date formatter as per the coder need
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //parse the string date-ti
        // me to Date object
        Date startDate = null;
        try {
            startDate = sdf.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        //end date will be the current system time to calculate the lapse time difference
        //if needed, coder can add end date to whatever date
        Date endDate = new Date();

        System.out.println(startDate);
        System.out.println(endDate);

        //get the time difference in milliseconds
        long duration = endDate.getTime() - startDate.getTime();

        //now we calculate the differences in different time units
        //this long value will be the total time difference in each unit
        //i.e; total difference in seconds, total difference in minutes etc...
        long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
        long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
        long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
        long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);

        //now we create the time stamps depending on the value of each unit that we get
        //as we do not have the unit in years,
        //we will see if the days difference is more that 365 days, as 365 days = 1 year
        if (diffInDays > 365) {
            //we get the year in integer not in float
            //ex- 791/365 = 2.167 in float but it will be 2 years in int
            int year = (int) (diffInDays / 365);
            timeDifference = year + " years ago";
            System.out.println(year + " years ago");
        }
        //if days are not enough to create year then get the days
        else if (diffInDays > 1) {
            timeDifference = diffInDays + " days ago";
            System.out.println(diffInDays + " days ago");
        }
        //if days value<1 then get the hours
        else if (diffInHours > 1) {
            timeDifference = diffInHours + " hours ago";
            System.out.println(diffInHours + " hours ago");
        }
        //if hours value<1 then get the minutes
        else if (diffInMinutes > 1) {
            timeDifference = diffInMinutes + " minutes ago";
            System.out.println(diffInMinutes + " minutes ago");
        }
        //if minutes value<1 then get the seconds
        else if (diffInSeconds > 1) {
            timeDifference = diffInSeconds + " seconds ago";
            System.out.println(diffInSeconds + " seconds ago");
        }

        return timeDifference;
// that's all. Happy Coding :)
    }

1

Geçenlerde benzer sorunu basit bir yöntem kullanarak çözdüm.

public static void main(String[] args) throws IOException, ParseException {
        TimeZone utc = TimeZone.getTimeZone("UTC");
        Calendar calendar = Calendar.getInstance(utc);
        Date until = calendar.getTime();
        calendar.add(Calendar.DAY_OF_MONTH, -7);
        Date since = calendar.getTime();
        long durationInSeconds  = TimeUnit.MILLISECONDS.toSeconds(until.getTime() - since.getTime());

        long SECONDS_IN_A_MINUTE = 60;
        long MINUTES_IN_AN_HOUR = 60;
        long HOURS_IN_A_DAY = 24;
        long DAYS_IN_A_MONTH = 30;
        long MONTHS_IN_A_YEAR = 12;

        long sec = (durationInSeconds >= SECONDS_IN_A_MINUTE) ? durationInSeconds % SECONDS_IN_A_MINUTE : durationInSeconds;
        long min = (durationInSeconds /= SECONDS_IN_A_MINUTE) >= MINUTES_IN_AN_HOUR ? durationInSeconds%MINUTES_IN_AN_HOUR : durationInSeconds;
        long hrs = (durationInSeconds /= MINUTES_IN_AN_HOUR) >= HOURS_IN_A_DAY ? durationInSeconds % HOURS_IN_A_DAY : durationInSeconds;
        long days = (durationInSeconds /= HOURS_IN_A_DAY) >= DAYS_IN_A_MONTH ? durationInSeconds % DAYS_IN_A_MONTH : durationInSeconds;
        long months = (durationInSeconds /=DAYS_IN_A_MONTH) >= MONTHS_IN_A_YEAR ? durationInSeconds % MONTHS_IN_A_YEAR : durationInSeconds;
        long years = (durationInSeconds /= MONTHS_IN_A_YEAR);

        String duration = getDuration(sec,min,hrs,days,months,years);
        System.out.println(duration);
    }
    private static String getDuration(long secs, long mins, long hrs, long days, long months, long years) {
        StringBuffer sb = new StringBuffer();
        String EMPTY_STRING = "";
        sb.append(years > 0 ? years + (years > 1 ? " years " : " year "): EMPTY_STRING);
        sb.append(months > 0 ? months + (months > 1 ? " months " : " month "): EMPTY_STRING);
        sb.append(days > 0 ? days + (days > 1 ? " days " : " day "): EMPTY_STRING);
        sb.append(hrs > 0 ? hrs + (hrs > 1 ? " hours " : " hour "): EMPTY_STRING);
        sb.append(mins > 0 ? mins + (mins > 1 ? " mins " : " min "): EMPTY_STRING);
        sb.append(secs > 0 ? secs + (secs > 1 ? " secs " : " secs "): EMPTY_STRING);
        sb.append("ago");
        return sb.toString();
    }

Beklendiği gibi Ve yazdırır: 7 days ago.


0

Bu yazdığım bir program, 2 tarih arasındaki gün sayısını (burada zaman yok) alıyor.

import java.util.Scanner;
public class HelloWorld {
 public static void main(String args[]) {
  Scanner s = new Scanner(System.in);
  System.out.print("Enter starting date separated by dots: ");
  String inp1 = s.nextLine();
  System.out.print("Enter ending date separated by dots: ");
  String inp2 = s.nextLine();
  int[] nodim = {
   0,
   31,
   28,
   31,
   30,
   31,
   30,
   31,
   31,
   30,
   31,
   30,
   31
  };
  String[] inpArr1 = split(inp1);
  String[] inpArr2 = split(inp2);
  int d1 = Integer.parseInt(inpArr1[0]);
  int m1 = Integer.parseInt(inpArr1[1]);
  int y1 = Integer.parseInt(inpArr1[2]);
  int d2 = Integer.parseInt(inpArr2[0]);
  int m2 = Integer.parseInt(inpArr2[1]);
  int y2 = Integer.parseInt(inpArr2[2]);
  if (y1 % 4 == 0) nodim[2] = 29;
  int diff = m1 == m2 && y1 == y2 ? d2 - (d1 - 1) : (nodim[m1] - (d1 - 1));
  int mm1 = m1 + 1, mm2 = m2 - 1, yy1 = y1, yy2 = y2;
  for (; yy1 <= yy2; yy1++, mm1 = 1) {
   mm2 = yy1 == yy2 ? (m2 - 1) : 12;
   if (yy1 % 4 == 0) nodim[2] = 29;
   else nodim[2] = 28;
   if (mm2 == 0) {
    mm2 = 12;
    yy2 = yy2 - 1;
   }
   for (; mm1 <= mm2 && yy1 <= yy2; mm1++) diff = diff + nodim[mm1];
  }
  System.out.print("No. of days from " + inp1 + " to " + inp2 + " is " + diff);
 }
 public static String[] split(String s) {
  String[] retval = {
   "",
   "",
   ""
  };
  s = s + ".";
  s = s + " ";
  for (int i = 0; i <= 2; i++) {
   retval[i] = s.substring(0, s.indexOf("."));
   s = s.substring((s.indexOf(".") + 1), s.length());
  }
  return retval;
 }
}

http://pastebin.com/HRsjTtUf


0

java.time.Duration

Hâlâ yanıtların hiçbirinin güncel ve konuya uygun olduğunu düşünmedim. İşte modern cevap şu şekilde:Duration modern Java tarih ve saat API'si olan java.time'ı (MayurB ve mkobit tarafından verilen cevaplar aynı sınıftan bahsediyor, ancak hiçbiri sorulduğu gibi günlere, saatlere, dakikalara ve dakikalara doğru şekilde dönüşmüyor).

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy/MM/dd HH:mm:ss");
    
    String dateStart = "11/03/14 09:29:58";
    String dateStop = "11/03/14 09:33:43";

    ZoneId zone = ZoneId.systemDefault();
    ZonedDateTime startDateTime = LocalDateTime.parse(dateStart, formatter).atZone(zone);
    ZonedDateTime endDateTime = LocalDateTime.parse(dateStop, formatter).atZone(zone);
    
    Duration diff = Duration.between(startDateTime, endDateTime);
    if (diff.isZero()) {
        System.out.println("0 minutes");
    } else {
        long days = diff.toDays();
        if (days != 0) {
            System.out.print("" + days + " days ");
            diff = diff.minusDays(days);
        }
        long hours = diff.toHours();
        if (hours != 0) {
            System.out.print("" + hours + " hours ");
            diff = diff.minusHours(hours);
        }
        long minutes = diff.toMinutes();
        if (minutes != 0) {
            System.out.print("" + minutes + " minutes ");
            diff = diff.minusMinutes(minutes);
        }
        long seconds = diff.getSeconds();
        if (seconds != 0) {
            System.out.print("" + seconds + " seconds ");
        }
        System.out.println();
    }

Bu örnek snippet'in çıktısı şöyledir:

3 dakika 45 saniye

Not Durationhep 24 saatleri gibi günün sayar. Yaz saati geçişleri gibi zaman anormalliklerini farklı şekilde ele almak istiyorsanız, çözümler (1) şunu kullanın ChronoUnit.DAYS(2) Kullan Period(3)Use YerelTarihSaatiinstead of geçişleri ZonedDateTime` bir hack olarak kabul edilebilir).

Yukarıdaki kod Java 8 ve java.time'ın Java 6 ve 7'ye arka portu olan ThreeTen Backport ile çalışır. Java 9'dan yöntemleri kullanarak biraz daha güzel yazmak mümkün olabilir toHoursPart,toMinutesPart vetoSecondsPart orada ekledi.

Zaman aldığım günlerden birinde açıklamaları daha ayrıntılı olarak açıklayacağım, belki önümüzdeki haftaya kadar değil.


-2
   // calculating the difference b/w startDate and endDate
        String startDate = "01-01-2016";
        String endDate = simpleDateFormat.format(currentDate);

        date1 = simpleDateFormat.parse(startDate);
        date2 = simpleDateFormat.parse(endDate);

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

        // using TimeUnit class from java.util.concurrent package
        long getDaysDiff = TimeUnit.MILLISECONDS.toDays(getDiff);

Java'da iki tarih arasındaki fark nasıl hesaplanır

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.