首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用Java计算两个日期之间的天数

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

Stack Overflow用户
提问于 2013-11-24 01:31:23
回答 15查看 621.7K关注 0票数 180

我想要一个Java程序,可以计算两个日期之间的日期。

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

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

我的代码:

代码语言:javascript
复制
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);
    }
}
EN

回答 15

Stack Overflow用户

发布于 2013-11-24 01:45:05

更新: 2013年的原始答案现在已经过时了,因为一些类已经被替换。执行此操作的新方法是使用新的java.time类。

代码语言:javascript
复制
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();
}

请注意,此解决方案将给出实际的24小时天数,而不是日历天数。对于后者,请使用

代码语言:javascript
复制
long daysBetween = ChronoUnit.DAYS.between(date1, date2)

原始答案(从Java8开始就过时了)

你正在对你的字符串进行一些不必要的转换。有一个用于它的SimpleDateFormat类--试试这个:

代码语言:javascript
复制
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:,因为有一些关于这段代码的正确性的讨论:它确实考虑到了闰年。但是,TimeUnit.DAYS.convert函数会丢失精度,因为毫秒转换为天(有关更多信息,请参阅链接的文档)。如果这是一个问题,也可以手动转换diff

代码语言:javascript
复制
float days = (diff / (1000*60*60*24));

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

票数 266
EN

Stack Overflow用户

发布于 2015-05-12 15:48:43

最简单的方法:

代码语言:javascript
复制
public static long getDifferenceDays(Date d1, Date d2) {
    long diff = d2.getTime() - d1.getTime();
    return TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
}
票数 123
EN

Stack Overflow用户

发布于 2015-04-23 10:26:26

在Java8中,您可以通过使用LocalDateDateTimeFormatter来实现这一点。来自LocalDateJavadoc

LocalDate是一个不可变的date-time对象,它表示日期,通常被视为年-月-日。

并且可以使用DateTimeFormatter构建该模式。下面是我使用的Javadoc和相关的模式字符:

Symbol -含义-演示-示例

y -时代之年- 2004;04

M/L -年月号/文本- 7;07;7月;7月;J

d -每月的日期-数字- 10

示例如下:

代码语言:javascript
复制
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);
    }
}

最近的输入/输出示例:

代码语言:javascript
复制
23 01 1997
27 04 1997
Days between: 94

最近的first:

代码语言:javascript
复制
27 04 1997
23 01 1997
Days between: -94

嗯,你可以用一种更简单的方式把它作为一个方法来做:

代码语言:javascript
复制
public static long betweenDates(Date firstDate, Date secondDate) throws IOException
{
    return ChronoUnit.DAYS.between(firstDate.toInstant(), secondDate.toInstant());
}
票数 93
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20165564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档