Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JAVA中计算两个日期之间的天数(catch ParseException错误)_Java_Date_Date Format_Parseexception - Fatal编程技术网

在JAVA中计算两个日期之间的天数(catch ParseException错误)

在JAVA中计算两个日期之间的天数(catch ParseException错误),java,date,date-format,parseexception,Java,Date,Date Format,Parseexception,我正在计算两次约会之间的天数。当我运行它时,它抛出捕获(ParseException ex)。 import java.text.SimpleDateFormat; import java.text.ParseException; import java.util.Date; import java.util.concurrent.TimeUnit; public class Main { public static void main(String[] args) {

我正在计算两次约会之间的天数。当我运行它时,它抛出捕获(ParseException ex)。

import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class Main {

    public static void main(String[] args) {

        String date1 = "11/11/2020";
        String date2 = "13/11/2020";

        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd-mm-yyyy");
            Date date_1 = dateFormat.parse(date1);
            Date date_2 = dateFormat.parse(date2);

            System.out.println(date_1);
            System.out.println(date_2);

            long numberOfDays = date_2.getTime() - date_1.getTime();
            numberOfDays = TimeUnit.DAYS.convert(numberOfDays, TimeUnit.MILLISECONDS);

            System.out.println(numberOfDays);

        } 
        catch (ParseException ex)
        {
            System.out.println("error");
        }
    }
}

除了捕获,没有错误,所以我有点迷路了。

只需更改以下内容:

 SimpleDateFormat dateFormat = new SimpleDateFormat("dd-mm-yyyy");
为此:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
您尝试分析的日期
11/11/2020
与您尝试使用的日期格式不匹配
dd-mm-yyyy

您可以通过打印出catch内的堆栈跟踪来自行解决此类问题:

ex.printStackTrace();

如果已打印捕获的异常:

System.out.println("error: " + ex.getLocalizedMessage());
你会看到:

error: Unparseable date: "11/11/2020"
问题在于:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-mm-yyyy");
将其更改为:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

因为提供的日期是这种格式。

您的模式不正确

您使用:

新的SimpleDataFormat(“dd-mm-yyyy”)

但你需要使用:

新简化格式(“dd/mm/yyyy”)


因为您的日期用“/”代替“-”

不要使用日期。试试这个

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        String date1 = "11/11/2020";
        String date2 = "13/11/2020";

        LocalDate d1 = LocalDate.parse(date1,dtf);
        LocalDate d2 = LocalDate.parse(date2,dtf);

        long ndays = d1.datesUntil(d2).count();
        System.out.println(ndays);

如果Java8是一个选项,我建议使用时间API

例如:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class Main
{
    public static void main(String[] args) {
        DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        String date1 = "11/11/2020";
        String date2 = "13/11/2020";

        LocalDate firstDate = LocalDate.parse(date1, format);
        LocalDate secondDate = LocalDate.parse(date2, format);

        long days = ChronoUnit.DAYS.between(firstDate, secondDate);
        System.out.println("Days between: " + days);
    }
}

首先,在输入日期和定义的格式中有不同的格式。因此,您将得到一个解析异常

其次,我们可以使用Java8中的
java.time.Duration
类进行此类计算。例如:

public static void main(String[] args) throws ParseException {
    String date1 = "11/11/2020";
    String date2 = "13/11/2020";
    DateFormat format = new SimpleDateFormat("dd/MM/yyyy");

    Duration duration = Duration.between(format.parse(date1).toInstant(), format.parse(date2).toInstant());
    System.out.println("Days between: " + duration.toDays());
}

“除了捕获,没有错误,所以我有点迷路了。”。。。那么,您是否应该打印异常显示的内容?将日期字符串改为使用“-”而不是“/”,例如“11-11-2020”。或者将SimpleDataFormat字符串更改为如下所示:“dd/mm/yyyy”语句“it throws the catch(ParseException ex)”非常奇怪。从本质上讲,“catch”块捕获异常,而不是抛出异常(好吧,您可以重新引用其中的某些内容)。建议正确处理捕获的期望值,例如至少使用
e.printStackTrace()而不是
System.out.println(“错误”)
正如我在回答中所建议的,
Date
已被弃用,不应使用
LocalDate
是与日期相关的代码。我建议您不要使用
SimpleDateFormat
date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。此外,将百万分之一转换为天可能会在夏季时间(DST)转换和类似转换中给出不准确的结果。改为使用
LocalDate
DateTimeFormatter
ChronoUnit.DAYS.between()
,所有这些都来自@WJS。根据JavaDoc,
mm
代表分钟。@WJS你说得对,很好,当时它有不止一个bug。我更新了答案,谢谢。时间会让你意识到
mm
的错误情况。使用它而不是麻烦的
SimpleDataFormat
还有一个原因。将mm更改为mm(分到月)。我同意自java 8以来使用java.time是一个很大的改进。更好的方法是:(1)完全停止使用旧的
DateFormat
SimpleDateFormat
Date
。(2) 使用
ChronoUnit.DAYS.between()
而不是
Duration
。顺便说一句,小写的
mm
对于月份来说是不正确的。谢谢@OleV.v1和2是很好的建议3)
mm
SimpleDateFormat
中工作正常,但在
DateTimeFormatter
中不工作。噢!我的错。我没有注意到。你说得对。谢谢