จะค้นหาระยะเวลาของความแตกต่างระหว่างวันที่สองวันใน java ได้อย่างไร?


105

ฉันมีสองวัตถุDateTimeซึ่งต้องการที่จะหาระยะเวลาของความแตกต่างของพวกเขา ,

ฉันมีรหัสต่อไปนี้ แต่ไม่แน่ใจว่าจะดำเนินการต่ออย่างไรเพื่อให้ได้ผลลัพธ์ที่คาดหวังดังต่อไปนี้:

ตัวอย่าง :

      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 minutes
      

รหัส :

    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
โปรดดูเวลา Joda ซึ่งได้สร้างขึ้นเพื่อรองรับสิ่งนี้
Erik Pragt

1
รหัสของคุณผิดอะไรคุณเพียงแค่ต้องปรับแต่งบางอย่างเพื่อให้ได้ผลลัพธ์ที่ต้องการลองดูสิ
Abubakkar

ก่อนอื่นให้ค้นหาความแตกต่างเป็นชั่วโมงโดยส่วนที่เหลือจะพบความแตกต่างเป็นนาทีแล้ววินาที!
NINCOMPOOP

1
@PeterLawrey ฉันได้ให้ตัวอย่างที่แตกต่างกัน
J888

1
การทำซ้ำ @aquestion หมายถึงคำถามสองข้อที่คาดหวังผลลัพธ์เดียวกันผลลัพธ์ที่คาดหวังของคำถามนี้จะแตกต่างกับคำถามที่คุณระบุ
Tim Norman

คำตอบ:


68

ลองทำดังต่อไปนี้

{
        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
คำตอบนี้จะไม่สนใจเขตเวลาที่กำหนดจุดเริ่มต้นและจุดสิ้นสุดของวัน คำตอบนี้จะไม่สนใจเวลาออมแสงและความผิดปกติอื่น ๆ ซึ่งหมายความว่าวันหนึ่ง ๆ ไม่ได้มีความยาว 24 ชั่วโมงเสมอไป ดูคำตอบที่ถูกต้องที่ใช้ไลบรารี Joda-Time หรือ java.time
Basil Bourque

3
ดังที่ Basil ได้ชี้ให้เห็นคำตอบนี้ไม่ถูกต้อง ระบุจำนวนวันที่ไม่ถูกต้องหากวันที่สิ้นสุดเกิดขึ้นในช่วงเวลาออมแสง แต่วันที่เริ่มต้นไม่
Dawood ibn Kareem

194

การแปลงวันที่แตกต่างกันสามารถจัดการในทางที่ดีโดยใช้ Java ตัวในชั้นเรียนTIMEUNIT มีวิธีการยูทิลิตี้ในการทำเช่นนั้น:

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
อีกทางเลือกหนึ่งคือ diffInSeconds = TimeUnit.SECONDS.convert (ระยะเวลา TimeUnit.MILLSECONDS);
gerardw

3
นี่คือคำตอบที่ดีที่สุด
Angel Cuenca

2
ฉันวินาทีนั้นการเคลื่อนไหว; คำตอบนี้ดีที่สุด
Mushy

3
ไม่ต้องพึ่งพาไลบรารีของบุคคลที่สาม
crmepham

สวัสดีก่อนอื่นขอบคุณมากสำหรับคำตอบสั้น ๆ และดีของคุณฉันประสบปัญหาหนึ่งในการแก้ปัญหาของคุณเช่นฉันมีสองวันที่ 06_12_2017_07_18_02_PM และอีกรายการหนึ่งคือ 06_12_2017_07_13_16_PM ฉันได้รับ 286 วินาทีแทนที่จะได้รับเพียง 46 วินาที
Siddhpura Amit

45

ใช้ไลบรารีJoda-Time

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

Joda Time มีแนวคิดเกี่ยวกับช่วงเวลา:

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

อีกหนึ่งตัวอย่าง ความแตกต่างของวันที่

อีกหนึ่งลิงค์

หรือด้วย Java-8 (ซึ่งรวมแนวคิด Joda-Time)

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

2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ เวลา Joda เป็นหนทางที่จะไป
Bizmarck

วิธีเดียวที่ปลอดภัยในการจัดการกับเขตเวลาอย่างเหมาะสมการเปลี่ยนแปลงตามฤดูกาล ฯลฯ
Newtopian

พิมพ์ผิดเล็กน้อย: คุณหมายถึง "จบ" ไม่ใช่ "หยุด" ในบรรทัดที่ 2 ของคุณ ("Duration dur = Duration.between (start, stop);")
Mohamad Fakih

12

นี่คือวิธีแก้ปัญหาใน Java 8 เช่นเดียวกับคำตอบของ shamimz

ที่มา: 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)");

รหัสสร้างผลลัพธ์ที่คล้ายกับต่อไปนี้:

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

เราต้องใช้ LocalDateTime http://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.htmlเพื่อรับความแตกต่างของชั่วโมงนาทีวินาที


มันเหมือนกับวิธี Joda-Time มากตามที่ MayurB ตอบ joda-time.sourceforge.net
johnkarka

1
ลิงก์ของคุณไปยังJoda-Timeเก่าแล้ว URL ปัจจุบันคือjoda.org/joda-time
Basil Bourque

LocalDate ไม่ได้จัดเก็บเวลาและเขตเวลา เอาแต่วัน - เดือน - ปี ดูdocs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
Shamim Ahmmed

สิ่งนี้ไม่ได้ใช้เวลาในการพิจารณา คำถามของ OP มีวินาทีนาทีและชั่วโมง
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");

สวัสดีก่อนอื่นขอบคุณมากสำหรับคำตอบสั้น ๆ และดีของคุณฉันกำลังประสบปัญหาหนึ่งในการแก้ปัญหาของคุณเช่นฉันมีสองวันที่ 06_12_2017_07_18_02_PM และอีกรายการหนึ่งคือ 06_12_2017_07_13_16_PM ฉันได้รับ 286 วินาทีแทนที่จะได้รับเพียง 46 วินาที
Siddhpura Amit

6

คุณสามารถสร้างวิธีการเช่น

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

วิธีนี้จะส่งกลับจำนวนวันระหว่าง 2 วัน


5

ดังที่ Michael Borgwardt เขียนไว้ในคำตอบของเขาที่นี่ :

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

โปรดทราบว่าสิ่งนี้ใช้ได้กับวันที่ UTC ดังนั้นความแตกต่างอาจเป็นวันหยุดหากคุณดูวันที่ในท้องถิ่น และการทำให้วันที่ในท้องถิ่นทำงานได้อย่างถูกต้องนั้นต้องใช้แนวทางที่แตกต่างไปจากเดิมอย่างสิ้นเชิงเนื่องจากเวลาออมแสง


1
ไม่ควรคูณค่าเหล่านี้ด้วยตนเอง ค่อนข้างใช้คลาส Java TimeUnit เพื่อทำเช่นนั้น
Shamim Ahmmed

2
สิ่งที่คุณพูดเกี่ยวกับวันที่ในท้องถิ่นไม่เป็นความจริง เมธอด getTime () ตาม API doc ส่งกลับจำนวนมิลลิวินาทีตั้งแต่วันที่ 1 มกราคม 1970, 00:00:00 GMT ที่แสดงโดยอ็อบเจ็กต์ Date นี้ หากตัวเลขสองตัวมีหน่วยเดียวกันก็สามารถบวกและลบได้อย่างปลอดภัย
Ingo

1
ใช่. ปลอดภัย แต่รหัสไม่สะอาดเนื่องจาก java มีวิธีจัดการมาตรฐานนี้
Shamim Ahmmed

1
นอกเหนือจากการให้ลิงก์ไปยังคำตอบแล้วคุณต้องระบุข้อความที่คุณคัดลอกมาจากผู้อื่นอย่างชัดเจน
Brad Larson

3

ใน Java 8 คุณสามารถทำของDateTimeFormatter, และDuration LocalDateTimeนี่คือตัวอย่าง:

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

ได้ผลสำหรับฉันสามารถลองกับสิ่งนี้หวังว่ามันจะเป็นประโยชน์ โปรดแจ้งให้เราทราบหากมีข้อกังวลใด ๆ

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
ยาว diffInSeconds = TimeUnit.MILLISECONDS.toSeconds (ระยะเวลา);
Keshav Gera

2

นี่คือรหัส:

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

และออกคือ:

duration: 1 day 11 hour 15 min 9 sec

2

อ้างอิงถึงการอัปเดตคำตอบของ shamim นี่เป็นวิธีการที่ทำงานโดยไม่ต้องใช้ไลบรารีของบุคคลที่สาม เพียงแค่คัดลอกวิธีการและใช้

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

ฉันแก้ไขปัญหาที่คล้ายกันโดยใช้วิธีง่ายๆเมื่อเร็ว ๆ นี้

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

และตามที่คาดไว้จะพิมพ์: 7 days ago.


0

นี่คือโปรแกรมที่ฉันเขียนขึ้นซึ่งได้รับจำนวนวันระหว่าง 2 วันที่ (ไม่มีเวลาที่นี่)

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

ฉันยังไม่รู้สึกว่าคำตอบใด ๆ นั้นทันสมัยและตรงประเด็น ดังนั้นนี่คือคำตอบที่ทันสมัยโดยใช้Durationจาก java.time วันที่และเวลาของ Java API สมัยใหม่ (คำตอบของ MayurB และ mkobit พูดถึงคลาสเดียวกัน แต่ไม่มีคำตอบใดที่แปลงเป็นวันชั่วโมงนาทีและนาทีได้อย่างถูกต้องตามที่ถาม)

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

ผลลัพธ์จากตัวอย่างข้อมูลนี้คือ:

3 นาที 45 วินาที

โปรดทราบว่าDurationจะนับวันเป็น 24 ชั่วโมงเสมอ หากคุณต้องการรักษาความผิดปกติของเวลาเช่นการเปลี่ยนเวลาในฤดูร้อนให้แตกต่างกันโซลูชัน inlcude (1) ใช้ChronoUnit.DAYS(2) Use Period(3) Use LocalDateTime instead ofZonedDateTime` (อาจถือเป็นการแฮ็ก)

รหัสข้างต้นการทำงานกับ Java 8 และมีการย้ายกลับ ThreeTen ที่ย้ายกลับของ java.time ชวา 6 และ 7 จาก 9 Java มันอาจจะเป็นไปได้ที่จะเขียนมันอีกเล็กน้อยอย่างการใช้วิธีการtoHoursPart, toMinutesPartและtoSecondsPartเพิ่มความมี

ฉันจะอธิบายรายละเอียดเพิ่มเติมอีกหนึ่งวันเมื่อฉันมีเวลาอาจจะไม่ถึงสัปดาห์หน้า


-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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.