Làm thế nào để tìm khoảng thời gian chênh lệch giữa hai ngày trong java?


103

Tôi có hai đối tượng DateTime , chúng cần tìm khoảng thời gian chênh lệch của chúng ,

Tôi có mã sau nhưng không chắc chắn làm thế nào để tiếp tục mã để có được kết quả mong đợi như sau:

Thí dụ

      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

    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
Hãy xem Joda time, đã được xây dựng để hỗ trợ cho việc này.
Erik Pragt,

1
sai gì với bạn mã, bạn chỉ cần một số tinh chỉnh để đạt được sản lượng yêu cầu, chúng ta hãy thử nó
Abubakkar

Đầu tiên, hãy tìm sự khác biệt theo giờ, phần còn lại tìm sự khác biệt theo phút và sau đó là giây!
NINCOMPOOP

1
@PeterLawrey tôi đã cung cấp ví dụ khác nhau
J888

1
@aquestion trùng lặp có nghĩa là hai câu hỏi mong đợi kết quả giống nhau, kết quả mong đợi của câu hỏi này khác với câu hỏi bạn đã cung cấp.
Tim Norman,

Câu trả lời:


67

thử những điều sau đây

{
        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
Câu trả lời này bỏ qua các múi giờ xác định ngày bắt đầu và kết thúc. Câu trả lời này bỏ qua Giờ tiết kiệm ánh sáng ban ngày và các điểm bất thường khác có nghĩa là một ngày không phải lúc nào cũng dài 24 giờ. Xem các câu trả lời chính xác sử dụng thư viện Joda-Time hoặc java.time.
Basil Bourque

3
Như Basil đã chỉ ra, câu trả lời này không chính xác. Nó cung cấp số ngày sai nếu ngày kết thúc xảy ra trong giờ tiết kiệm ánh sáng ban ngày nhưng ngày bắt đầu thì không.
Dawood ibn Kareem

191

Việc chuyển đổi chênh lệch ngày tháng có thể được xử lý theo cách tốt hơn bằng cách sử dụng lớp tích hợp sẵn của Java, TimeUnit . Nó cung cấp các phương thức tiện ích để làm điều đó:

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
Hoặc dài diffInSeconds = TimeUnit.SECONDS.convert (thời lượng, TimeUnit.MILLSECONDS);
gerardw

3
Đây là câu trả lời tốt nhất.
Angel Cuenca

2
Tôi thứ hai chuyển động đó; Câu trả lời này là tốt nhất.
Mushy

3
Không phụ thuộc vào thư viện của bên thứ 3.
crmepham

Xin chào trước tiên, cảm ơn bạn rất nhiều vì câu trả lời ngắn gọn và hay, tôi đang gặp phải một vấn đề trong giải pháp của bạn như tôi có hai ngày 06_12_2017_07_18_02_PM và một ngày khác là 06_12_2017_07_13_16_PM, tôi nhận được 286 giây thay vì tôi chỉ có 46 giây
Siddhpura Amit

44

Sử dụng thư viện Joda-Time

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

Joda Time có khái niệm về Khoảng thời gian:

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

Thêm một ví dụ về sự khác biệt ngày tháng

Thêm một liên kết

hoặc với Java-8 (tích hợp các khái niệm Joda-Time)

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

2
Đây phải là câu trả lời được chấp nhận. Giờ Joda là con đường để đi
Bizmarck

Cách an toàn duy nhất để xử lý đúng múi giờ, thay đổi ánh sáng ban ngày, v.v.
Newtopian

Chỉ một lỗi đánh máy nhỏ: ý bạn là "kết thúc" chứ không phải "dừng lại" ở dòng thứ 2 ("Duration dur = Duration.between (start, stop);").
Mohamad Fakih

12

Đây là cách vấn đề có thể được giải quyết trong Java 8 giống như câu trả lời của shamimz.

Nguồn: 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)");

Mã tạo ra đầu ra tương tự như sau:

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

Chúng tôi phải sử dụng LocalDateTime http://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html để nhận được sự khác biệt giờ, phút, giây.


Nó rất giống cách Joda-Time như MayurB đã trả lời. joda-time.sourceforge.net
johnkarka

1
Liên kết của bạn đến Joda-Time đã cũ. URL hiện tại là joda.org/joda-time
Basil Bourque

LocalDate không lưu trữ thời gian và múi giờ. Nó chỉ giữ ngày-tháng-năm. xem docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
Shamim Ahmmed

Điều này không cần thời gian để xem xét. Câu hỏi của OP có giây, phút và giờ.
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");

Xin chào trước tiên, cảm ơn bạn rất nhiều vì câu trả lời ngắn gọn và hay, tôi đang gặp phải một vấn đề trong giải pháp của bạn như tôi có hai ngày 06_12_2017_07_18_02_PM và một ngày khác là 06_12_2017_07_13_16_PM, tôi nhận được 286 giây thay vì tôi chỉ có 46 giây
Siddhpura Amit

6

Bạn có thể tạo một phương pháp như

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

Phương thức này sẽ trả về số ngày giữa 2 ngày.


5

Như Michael Borgwardt viết trong câu trả lời của mình ở đây :

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

Lưu ý rằng điều này hoạt động với các ngày UTC, vì vậy sự khác biệt có thể là một ngày nghỉ nếu bạn xem các ngày địa phương. Và để nó hoạt động chính xác với ngày địa phương đòi hỏi một cách tiếp cận hoàn toàn khác do tiết kiệm thời gian ánh sáng ban ngày.


1
Không nên nhân những giá trị này theo cách thủ công. Thay vì sử dụng lớp TimeUnit java để làm điều đó.
Shamim Ahmmed

2
Những gì bạn nói về ngày tháng ở địa phương là không đúng. Phương thức getTime (), theo API doc Trả về số mili giây kể từ ngày 1 tháng 1 năm 1970, 00:00:00 GMT được đại diện bởi đối tượng Ngày này. Nếu hai số có cùng đơn vị, thì an toàn khi cộng và trừ chúng.
Ingo

1
Đúng. Nó an toàn nhưng mã không sạch vì java cung cấp cách tiêu chuẩn để xử lý điều này.
Shamim Ahmmed

1
Ngoài việc cung cấp liên kết đến câu trả lời, bạn phải trích dẫn rõ ràng từ ngữ mà bạn đã sao chép từ người khác.
Brad Larson

3

Trong Java 8, bạn có thể làm cho các DateTimeFormatter, DurationLocalDateTime. Đây là một ví dụ:

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

Nó làm việc cho tôi có thể thử với điều này, hy vọng nó sẽ hữu ích. Hãy cho tôi biết nếu có bất kỳ mối quan tâm nào.

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 (thời lượng);
Keshav Gera

2

Đây là mã:

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

và kết quả là:

duration: 1 day 11 hour 15 min 9 sec

2

với tham chiếu đến cập nhật câu trả lời của shamim đây là một phương pháp thực hiện nhiệm vụ mà không cần sử dụng bất kỳ thư viện bên thứ ba nào. Chỉ cần sao chép phương pháp và sử dụng

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

Tôi đã giải quyết vấn đề tương tự bằng một phương pháp đơn giản gần đây.

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

Và như mong đợi nó in: 7 days ago.


0

Đây là một chương trình tôi đã viết, lấy số ngày giữa 2 ngày (không có thời gian ở đây).

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


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

Cách tính toán chênh lệch giữa hai ngày trong Java

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.