Bagaimana cara mengetahui perbedaan durasi antara dua buah kurma di Jawa?

103

Saya memiliki dua objek DateTime , yang perlu menemukan durasi perbedaannya ,

Saya memiliki kode berikut tetapi tidak yakin bagaimana melanjutkannya untuk mendapatkan hasil yang diharapkan sebagai berikut:

Contoh

      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

Kode

    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.");
J888
sumber
5
Silakan lihat waktu Joda, yang telah membangun dukungan untuk ini.
Erik Pragt
1
apa yang salah dengan kode Anda, Anda hanya perlu beberapa penyesuaian untuk mencapai output yang diperlukan, mari kita coba
Abubakkar
Pertama temukan perbedaan jam, dengan sisanya temukan perbedaan dalam menit dan kemudian detik!
NINCOMPOOP
1
@PeterLawrey Saya telah memberikan contoh yang berbeda
J888
1
@aquestion duplication berarti dua pertanyaan yang mengharapkan hasil yang sama, keluaran yang diharapkan dari pertanyaan ini berbeda dengan yang Anda berikan.
Tim Norman

Jawaban:

68

coba yang berikut ini

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

sumber
20
Jawaban ini mengabaikan zona waktu yang menentukan awal dan akhir hari. Jawaban ini mengabaikan Waktu Musim Panas dan anomali lainnya yang berarti satu hari tidak selalu 24 jam lamanya. Lihat jawaban benar yang menggunakan perpustakaan Joda-Time atau java.time.
Basil Bourque
3
Seperti yang ditunjukkan Basil, jawaban ini salah. Ini memberikan jumlah hari yang salah jika tanggal akhir terjadi selama waktu musim panas tetapi tanggal mulai tidak.
Dawood ibn Kareem
191

Konversi perbedaan tanggal dapat ditangani dengan cara yang lebih baik menggunakan kelas bawaan Java , TimeUnit . Ini menyediakan metode utilitas untuk melakukan itu:

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);
Shamim Ahmmed
sumber
2
Alternatifnya panjang diffInSeconds = TimeUnit.SECONDS.convert (durasi, TimeUnit.MILLSECONDS);
gerardw
3
Ini jawaban terbaik.
Angel Cuenca
2
Saya mendukung gerakan itu; Jawaban ini adalah yang terbaik.
Lembek
3
Tidak ada ketergantungan pada perpustakaan pihak ketiga.
crmepham
Hai pertama-tama terima kasih banyak atas jawaban singkat dan bagus Anda, saya menghadapi satu masalah pada solusi Anda seperti saya memiliki dua tanggal 06_12_2017_07_18_02_PM dan satu lagi adalah 06_12_2017_07_13_16_PM, saya mendapatkan 286 detik sebagai gantinya saya hanya mendapatkan 46 detik
Siddhpura Amit
44

Gunakan perpustakaan Joda-Time

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

Joda Time memiliki konsep Time Interval:

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

Satu lagi contoh Perbedaan Tanggal

Satu Tautan lagi

atau dengan Java-8 (yang mengintegrasikan konsep Joda-Time)

Instant start, end;//
Duration dur = Duration.between(start, stop);
long hours = dur.toHours();
long minutes = dur.toMinutes();
MayurB
sumber
2
Ini harus menjadi jawaban yang diterima. Waktu Joda adalah cara untuk pergi
Bizmarck
Satu-satunya cara yang aman untuk menangani zona waktu dengan benar, perubahan siang hari, dll.
Newtopian
Hanya salah ketik kecil: yang Anda maksud adalah "end" bukan "stop" di baris ke-2 Anda ("Duration dur = Duration.between (start, stop);").
Mohamad Fakih
12

Berikut adalah bagaimana masalah bisa diselesaikan di Java 8 seperti jawaban shamimz.

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

Kode tersebut menghasilkan keluaran yang mirip dengan berikut ini:

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

Kita harus menggunakan LocalDateTime http://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html untuk mendapatkan perbedaan jam, menit, detik.

johnkarka
sumber
Ini sangat mirip dengan cara Joda-Time seperti yang dijawab oleh MayurB. joda-time.sourceforge.net
johnkarka
1
Tautan Anda ke Joda-Time sudah lama. URL saat ini adalah joda.org/joda-time
Basil Bourque
LocalDate tidak menyimpan waktu dan zona waktu. Itu hanya menyimpan hari-bulan-tahun. lihat docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
Shamim Ahmmed
Ini tidak menyita waktu. Pertanyaan OP memiliki detik, menit, dan jam.
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");
mkobit
sumber
Hai pertama-tama terima kasih banyak atas jawaban singkat dan bagus Anda, saya menghadapi satu masalah pada solusi Anda seperti saya memiliki dua tanggal 06_12_2017_07_18_02_PM dan satu lagi adalah 06_12_2017_07_13_16_PM, saya mendapatkan 286 detik sebagai gantinya saya hanya mendapatkan 46 detik
Siddhpura Amit
6

Anda dapat membuat metode seperti

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

Metode ini akan mengembalikan jumlah hari antara 2 hari tersebut.

Vishal Kumar
sumber
5

Seperti yang ditulis Michael Borgwardt dalam jawabannya di sini :

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

Perhatikan bahwa ini berfungsi dengan tanggal UTC, jadi perbedaannya mungkin hari libur jika Anda melihat tanggal lokal. Dan membuatnya berfungsi dengan benar dengan tanggal lokal membutuhkan pendekatan yang sama sekali berbeda karena waktu musim panas.

Ghostman
sumber
1
Bukan ide yang baik untuk mengalikan nilai ini secara manual. Lebih baik gunakan kelas Java TimeUnit untuk melakukan itu.
Shamim Ahmmed
2
Apa yang Anda katakan tentang tanggal lokal tidak benar. Metode getTime (), menurut API doc Mengembalikan jumlah milidetik sejak 1 Januari 1970, 00:00:00 GMT yang diwakili oleh objek Tanggal ini. Jika dua bilangan memiliki satuan yang sama, maka aman untuk menambah dan menguranginya.
Ingo
1
Iya. Ini aman tetapi kodenya tidak bersih karena java menyediakan cara standar untuk menangani ini.
Shamim Ahmmed
1
Selain memberikan tautan ke sebuah jawaban, Anda harus mengutip dengan jelas kata-kata yang telah Anda salin dari orang lain.
Brad Larson
3

Di Jawa 8, Anda dapat membuat dari DateTimeFormatter, Duration, dan LocalDateTime. Berikut ini contohnya:

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));
mkobit
sumber
3

Berhasil bagi saya dapat mencoba dengan ini, semoga bermanfaat. Beri tahu saya jika ada kekhawatiran.

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 .**
Tarit Ray
sumber
1
long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds (durasi);
Keshav Gera
2

Ini kodenya:

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

dan yang keluar adalah:

duration: 1 day 11 hour 15 min 9 sec
AYRM1112013
sumber
2

dengan mengacu pada pembaruan jawaban shamim di sini adalah metode yang melakukan tugas tanpa menggunakan pustaka pihak ketiga. Cukup salin metode dan gunakan

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 :)
    }
Tarun Kumar
sumber
1

Saya memecahkan masalah serupa menggunakan metode sederhana baru-baru ini.

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

Dan seperti yang diharapkan mencetak: 7 days ago.

akhil_mittal
sumber
0

Ini adalah program yang saya tulis, yang mendapatkan jumlah hari antara 2 tanggal (tidak ada waktu di sini).

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

Naman Chhaparia
sumber
-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);

Bagaimana menghitung perbedaan antara dua tanggal di Jawa

Sugriv Shekhar
sumber