在我添加了throws ParseException之后,解析异常仍然发生,为什么



问题是计算两个日期之间的天数。这是我的代码

public static void main(String[] args) throws ParseException  {
// TODO Auto-generated method stub
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd)");
Scanner input=new Scanner(System.in);
String date1=input.nextLine();
String date2=input.nextLine();
Date d1 =sdf.parse(date1);
Date d2= sdf.parse(date2);
if(d1.getTime()>d2.getTime()) {
System.out.println(d2.getTime()-d1.getTime()/(24*60*60*1000));
}
else
System.out.println(d1.getTime()-d2.getTime()/(24*60*60*1000));

输出为

2010/05/29
2010/01/01
Exception in thread "main" java.text.ParseException: Unparseable date: "2010/05/29"
at java.base/java.text.DateFormat.parse(DateFormat.java:396)
at HW10_09156136_1092.HW10_Ex01.main(HW10_Ex01.java:15)

您在M[年中的月]处使用了m[小时中的分钟]。

您的输入使用/作为分隔符,而您在解析器中为其指定了-。输入应该与解析器指定的模式相匹配。

除此之外,java.util日期-时间API及其格式API、SimpleDateFormat已经过时,并且是错误的。建议完全停止使用它们,并切换到现代日期时间API*

使用现代日期时间APIjava.time演示:

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class Main {
public static void main(String[] args) {
String strDateStart = "2021-06-09";
String strDateEnd = "2021-06-12";
LocalDate dateStart = LocalDate.parse(strDateStart);
LocalDate dateEnd = LocalDate.parse(strDateEnd);
long days = ChronoUnit.DAYS.between(dateStart, dateEnd);
System.out.println(days);
}
}

输出:

3

在线演示

现代的Date-Time API基于ISO8601,只要Date-Time字符串符合ISO8601标准,就不需要显式使用DateTimeFormatter对象。

跟踪:日期时间了解有关现代日期时间API的更多信息。

使用传统API:

如果已经存在相同的API,请避免自己执行计算。例如,下面的代码使用Math#absTimeUnit#convert来避免出现错误。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws ParseException {
String strDateStart = "2021-06-09";
String strDateEnd = "2021-06-12";

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date dateStart = sdf.parse(strDateStart);
Date dateEnd = sdf.parse(strDateEnd);

long millisInOneDay = TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
long days = Math.abs((dateEnd.getTime() - dateStart.getTime()) / millisInOneDay);

System.out.println(days);
}
}

在线演示

在我添加throws ParseException之后,解析exception仍然发生了,为什么?

throws子句添加到方法中会强制该方法的调用方使用try-catch处理异常或重新引发异常。这不是防止抛出异常的方法。从Oracle的这篇优秀教程中了解更多关于它的信息。


*出于任何原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen BackportJava.time的大部分功能向后移植到Java 6&7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API

相关内容

  • 没有找到相关文章

最新更新