Calculating days between two dates with Java

前端 未结 11 1514
天命终不由人
天命终不由人 2020-11-22 04:42

I want a Java program that calculates days between two dates.

  1. Type the first date (German notation; with whitespaces: \"dd mm yyyy\")
  2. Type the second
相关标签:
11条回答
  • 2020-11-22 05:10

    UPDATE: The original answer from 2013 is now outdated because some of the classes have been replaced. The new way of doing this is using the new java.time classes.

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd MM yyyy");
    String inputString1 = "23 01 1997";
    String inputString2 = "27 04 1997";
    
    try {
        LocalDateTime date1 = LocalDate.parse(inputString1, dtf);
        LocalDateTime date2 = LocalDate.parse(inputString2, dtf);
        long daysBetween = Duration.between(date1, date2).toDays();
        System.out.println ("Days: " + daysBetween);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    

    Note that this solution will give the number of actual 24 hour-days, not the number of calendar days. For the latter, use

    long daysBetween = ChronoUnit.DAYS.between(date1, date2)
    

    Original answer (outdated as of Java 8)

    You are making some conversions with your Strings that are not necessary. There is a SimpleDateFormat class for it - try this:

    SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy");
    String inputString1 = "23 01 1997";
    String inputString2 = "27 04 1997";
    
    try {
        Date date1 = myFormat.parse(inputString1);
        Date date2 = myFormat.parse(inputString2);
        long diff = date2.getTime() - date1.getTime();
        System.out.println ("Days: " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    

    EDIT: Since there have been some discussions regarding the correctness of this code: it does indeed take care of leap years. However, the TimeUnit.DAYS.convert function loses precision since milliseconds are converted to days (see the linked doc for more info). If this is a problem, diff can also be converted by hand:

    float days = (diff / (1000*60*60*24));
    

    Note that this is a float value, not necessarily an int.

    0 讨论(0)
  • 2020-11-22 05:17

    In Java 8, you could accomplish this by using LocalDate and DateTimeFormatter. From the Javadoc of LocalDate:

    LocalDate is an immutable date-time object that represents a date, often viewed as year-month-day.

    And the pattern can be constructed using DateTimeFormatter. Here is the Javadoc, and the relevant pattern characters I used:

    Symbol - Meaning - Presentation - Examples

    y - year-of-era - year - 2004; 04

    M/L - month-of-year - number/text - 7; 07; Jul; July; J

    d - day-of-month - number - 10

    Here is the example:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    import java.time.temporal.ChronoUnit;
    
    public class Java8DateExample {
        public static void main(String[] args) throws IOException {
            final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MM yyyy");
            final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            final String firstInput = reader.readLine();
            final String secondInput = reader.readLine();
            final LocalDate firstDate = LocalDate.parse(firstInput, formatter);
            final LocalDate secondDate = LocalDate.parse(secondInput, formatter);
            final long days = ChronoUnit.DAYS.between(firstDate, secondDate);
            System.out.println("Days between: " + days);
        }
    }
    

    Example input/output with more recent last:

    23 01 1997
    27 04 1997
    Days between: 94
    

    With more recent first:

    27 04 1997
    23 01 1997
    Days between: -94
    

    Well, you could do it as a method in a simpler way:

    public static long betweenDates(Date firstDate, Date secondDate) throws IOException
    {
        return ChronoUnit.DAYS.between(firstDate.toInstant(), secondDate.toInstant());
    }
    
    0 讨论(0)
  • 2020-11-22 05:18

    We can make use of LocalDate and ChronoUnit java library, Below code is working fine. Date should be in format yyyy-MM-dd.

    import java.time.LocalDate;
    import java.time.temporal.ChronoUnit;
    import java.util.*;
    class Solution {
        public int daysBetweenDates(String date1, String date2) {
            LocalDate dt1 = LocalDate.parse(date1);
            LocalDate dt2= LocalDate.parse(date2);
    
            long diffDays = ChronoUnit.DAYS.between(dt1, dt2);
    
            return Math.abs((int)diffDays);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 05:19

    The best way, and it converts to a String as bonus ;)

    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            //Dates to compare
            String CurrentDate=  "09/24/2015";
            String FinalDate=  "09/26/2015";
    
            Date date1;
            Date date2;
    
            SimpleDateFormat dates = new SimpleDateFormat("MM/dd/yyyy");
    
            //Setting dates
            date1 = dates.parse(CurrentDate);
            date2 = dates.parse(FinalDate);
    
            //Comparing dates
            long difference = Math.abs(date1.getTime() - date2.getTime());
            long differenceDates = difference / (24 * 60 * 60 * 1000);
    
            //Convert long to String
            String dayDifference = Long.toString(differenceDates);
    
            Log.e("HERE","HERE: " + dayDifference);
        }
        catch (Exception exception) {
            Log.e("DIDN'T WORK", "exception " + exception);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 05:20
    // date format, it will be like "2015-01-01"
    private static final String DATE_FORMAT = "yyyy-MM-dd";
    
    // convert a string to java.util.Date
    public static Date convertStringToJavaDate(String date)
            throws ParseException {
        DateFormat dataFormat = new SimpleDateFormat(DATE_FORMAT);
        return dataFormat.parse(date);
    }
    
    // plus days to a date
    public static Date plusJavaDays(Date date, int days) {
        // convert to jata-time
        DateTime fromDate = new DateTime(date);
        DateTime toDate = fromDate.plusDays(days);
        // convert back to java.util.Date
        return toDate.toDate();
    }
    
    // return a list of dates between the fromDate and toDate
    public static List<Date> getDatesBetween(Date fromDate, Date toDate) {
        List<Date> dates = new ArrayList<Date>(0);
        Date date = fromDate;
        while (date.before(toDate) || date.equals(toDate)) {
            dates.add(date);
            date = plusJavaDays(date, 1);
        }
        return dates;
    }
    
    0 讨论(0)
提交回复
热议问题