使用Java计算两个日期之间的天数

use*_*448 133 java date-arithmetic

我想要一个Java程序来计算两个日期之间的天数.

  1. 输入第一个日期(德语表示法;带空格:"dd mm yyyy")
  2. 输入第二个日期.
  3. 该程序应计算两个日期之间的天数.

我怎样才能包括闰年和夏季?

我的代码:

import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class NewDateDifference {

    public static void main(String[] args) {

        System.out.print("Insert first date: ");
        Scanner s = new Scanner(System.in);
        String[] eingabe1 = new String[3];

        while (s.hasNext()) {
            int i = 0;
            insert1[i] = s.next();
            if (!s.hasNext()) {
                s.close();
                break;
            }
            i++;
        }

        System.out.print("Insert second date: ");
        Scanner t = new Scanner(System.in);
        String[] insert2 = new String[3];

        while (t.hasNext()) {
            int i = 0;
            insert2[i] = t.next();
            if (!t.hasNext()) {
                t.close();
                break;
            }
            i++;
        }

        Calendar cal = Calendar.getInstance();

        cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(insert1[0]));
        cal.set(Calendar.MONTH, Integer.parseInt(insert1[1]));
        cal.set(Calendar.YEAR, Integer.parseInt(insert1[2]));
        Date firstDate = cal.getTime();

        cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(insert2[0]));
        cal.set(Calendar.MONTH, Integer.parseInt(insert2[1]));
        cal.set(Calendar.YEAR, Integer.parseInt(insert2[2]));
        Date secondDate = cal.getTime();


        long diff = secondDate.getTime() - firstDate.getTime();

        System.out.println ("Days: " + diff / 1000 / 60 / 60 / 24);
    }
}
Run Code Online (Sandbox Code Playgroud)

jen*_*108 203

您正在使用不必要的字符串进行一些转换.有一个SimpleDateFormat类 - 试试这个:

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();
}
Run Code Online (Sandbox Code Playgroud)

编辑:由于已经就此代码的正确性进行了一些讨论:它确实照顾了闰年.但是,该TimeUnit.DAYS.convert函数会丢失精度,因为毫秒将转换为天数(有关详细信息,请参阅链接的文档).如果这是一个问题,diff也可以手工转换:

float days = (diff / (1000*60*60*24));
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个float值,不一定是int.

  • 这是一个糟糕的实现,没有正确计算闰年. (40认同)
  • 我相信这对闰年来说是正确的,但它会让夏令时变得混乱.如果您的地区有夏令时,那么每年有一天有23小时,有一天有25小时.此解决方案错误地假设每天都有24小时.因此,对于在非夏令时期间开始并在夏令时期间结束的任何时段,它给出了错误的答案.不要使用这个解决方案 - 有更好的方法. (8认同)
  • TimeUnit.DAYS.convert(diff,TimeUnit.MILLISECONDS)); <3 (3认同)
  • @GroovyEd从我测试的内容来看,这段代码似乎没有闰年的问题.请注意,TimeUnit.Days.convert()将忽略剩余单位,例如将999毫秒转换为秒,结果为0.这意味着如果您使用新的Date()作为Date对象之一,则可能会减少一天,因此请注意 (3认同)
  • 它也适用于闰年.检查这个`String inputString1 ="28 2 2016"; String inputString2 ="1 3 2016";`ans:2 (2认同)

小智 93

最简单的方法:

public static long getDifferenceDays(Date d1, Date d2) {
    long diff = d2.getTime() - d1.getTime();
    return TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
}
Run Code Online (Sandbox Code Playgroud)

  • 注意,这只计算在两个日期之间的时间间隔大于24小时(从代码中非常明显),因此`getDifferenceDays(11PM,次日凌晨4点)== 0` (14认同)
  • 好吧,基本上这与[当前最佳答案](http://stackoverflow.com/a/20165708/2821954)相同,尽管这个答案提供了它作为一个功能. (5认同)
  • 这个答案是不正确的。它没有正确处理夏令时。如果您想要正确的结果,请不要使用它。 (3认同)
  • 不考虑闰年或夏令时...... (2认同)

mko*_*bit 81

在Java 8中,您可以使用LocalDate和完成此操作DateTimeFormatter.从的JavadocLocalDate:

LocalDate是一个不可变的日期时间对象,表示日期,通常被视为年 - 月 - 日.

并且可以使用构造模式DateTimeFormatter.这是Javadoc,以及我使用的相关模式字符:

符号 - 含义 - 演示 - 示例

y - 年代 - - 2004年; 04

M/L - 月份 - 数字/文本 - 7; 07; 7月; 七月; Ĵ

d - 每月 - 数字 - 10

这是一个例子:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

最近的最后输入/输出示例:

23 01 1997
27 04 1997
Days between: 94
Run Code Online (Sandbox Code Playgroud)

最近的第一个:

27 04 1997
23 01 1997
Days between: -94
Run Code Online (Sandbox Code Playgroud)

好吧,你可以用更简单的方式做一个方法:

public static long betweenDates(Date firstDate, Date secondDate) throws IOException
{
    return ChronoUnit.DAYS.between(firstDate.toInstant(), secondDate.toInstant());
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的例子.这自动占闰年.如果您检查了1991年和1992年(闰年),它会正确计算.完善! (4认同)
  • 这是当前/现代的答案(其他的已经过时).它也是夏令时(DST)的原因.要在Java 6或7上使用,请获取[ThreeTen Backport](http://www.threeten.org/threetenbp/).在非全新的Android [ThreeTenABP](https://github.com/JakeWharton/ThreeTenABP)上. (2认同)

Joh*_*hey 61

当夏令时出现时,大多数/所有答案都会给我们带来问题.这是我们针对所有日期的工作解决方案,而不使用JodaTime.它利用日历对象:

public static int daysBetween(Calendar day1, Calendar day2){
    Calendar dayOne = (Calendar) day1.clone(),
            dayTwo = (Calendar) day2.clone();

    if (dayOne.get(Calendar.YEAR) == dayTwo.get(Calendar.YEAR)) {
        return Math.abs(dayOne.get(Calendar.DAY_OF_YEAR) - dayTwo.get(Calendar.DAY_OF_YEAR));
    } else {
        if (dayTwo.get(Calendar.YEAR) > dayOne.get(Calendar.YEAR)) {
            //swap them
            Calendar temp = dayOne;
            dayOne = dayTwo;
            dayTwo = temp;
        }
        int extraDays = 0;

        int dayOneOriginalYearDays = dayOne.get(Calendar.DAY_OF_YEAR);

        while (dayOne.get(Calendar.YEAR) > dayTwo.get(Calendar.YEAR)) {
            dayOne.add(Calendar.YEAR, -1);
            // getActualMaximum() important for leap years
            extraDays += dayOne.getActualMaximum(Calendar.DAY_OF_YEAR);
        }

        return extraDays - dayTwo.get(Calendar.DAY_OF_YEAR) + dayOneOriginalYearDays ;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不适用于30/11/2015 01/12/2015日期 (3认同)
  • 不要忘记Calendar Class中的Month值是从0开始的.calendar.set(2015,11,30,0,00,00); 实际上意味着30/12/2015 (2认同)

The*_*ble 16

最好的方法,它转换为String作为奖金;)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这在闰年不起作用。例如,从“02/15/2020”到“04/02/2020”是 47 天。这个逻辑会得出46。 (2认同)

Jul*_*ien 10

众所周知,Java日期库已被破坏.我建议使用Joda Time.它会照顾闰年,时区等等.

最小的工作示例:

import java.util.Scanner;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class DateTestCase {

    public static void main(String[] args) {

        System.out.print("Insert first date: ");
        Scanner s = new Scanner(System.in);
        String firstdate = s.nextLine();
        System.out.print("Insert second date: ");
        String seconddate = s.nextLine();

        // Formatter
        DateTimeFormatter dateStringFormat = DateTimeFormat
                .forPattern("dd MM yyyy");
        DateTime firstTime = dateStringFormat.parseDateTime(firstdate);
        DateTime secondTime = dateStringFormat.parseDateTime(seconddate);
        int days = Days.daysBetween(new LocalDate(firstTime),
                                    new LocalDate(secondTime)).getDays();
        System.out.println("Days between the two dates " + days);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案可以通过几种方式得到改善.(a)指定时区而不是依赖于JVM的默认值.因此,在创建DateTimeFormatter时,添加对`withZone(DateTimeZone.forID("Europe/Berlin"))`的调用.(b)为什么在`daysBetween`调用中使用`LocalDate`?只需传递DateTime对象(firstTime,secondTime).整整一天,请调用`withTimeAtStartOfDays`.(c)我会使用变量名`firstDateTime`而不是`firstTime`来避免日期,时间和日期时间对象之间的歧义.(d)添加一些try-catch来处理与我们预期的格式不匹配的错误数据输入. (4认同)

小智 8

使用:

public int getDifferenceDays(Date d1, Date d2) {
    int daysdiff = 0;
    long diff = d2.getTime() - d1.getTime();
    long diffDays = diff / (24 * 60 * 60 * 1000) + 1;
    daysdiff = (int) diffDays;
    return daysdiff;
}
Run Code Online (Sandbox Code Playgroud)


YMG*_*YMG 8

如果你只想获取天数(没有时间),那么你可以使用 ChronoUnit

ChronoUnit.DAYS.between(date1.toLocalDate(), date2.toLocalDate());
Run Code Online (Sandbox Code Playgroud)


小智 5

String dateStart = "01/14/2015 08:29:58";
String dateStop = "01/15/2015 11:31:48";

//HH converts hour in 24 hours format (0-23), day calculation
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

Date d1 = null;
Date d2 = null;

d1 = format.parse(dateStart);
d2 = format.parse(dateStop);

//in milliseconds
long diff = d2.getTime() - d1.getTime();

long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffDays = diff / (24 * 60 * 60 * 1000);

System.out.print(diffDays + " days, ");
System.out.print(diffHours + " hours, ");
System.out.print(diffMinutes + " minutes, ");
System.out.print(diffSeconds + " seconds.");
Run Code Online (Sandbox Code Playgroud)