问题描述
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
[Month in year] 的地方使用了 M
[Minute in hour]。
? 您的输入以 /
作为分隔符,而您在解析器中为它指定了 -
。输入应与解析器指定的模式匹配。
除此之外,java.util
日期时间 API 及其格式 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*。
使用 java.time
的现代日期时间 API 的演示:
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
现代日期时间 API 基于 ISO 8601,只要日期时间字符串符合 ISO 8601 标准,就不需要明确使用 DateTimeFormatter
对象。
从 Trail: Date Time 了解有关现代 Date-Time API 的更多信息。
使用旧 API:
如果已经存在相同的 API,请避免自己执行计算,例如以下代码使用 Math#abs
和 TimeUnit#convert
来避免容易出错的 if-else 和计算。
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 后,解析异常仍然存在 发生了,为什么?
向方法添加 throws
子句会强制方法的调用者使用 try-catch 处理异常或重新抛出它。这不是防止抛出异常的方法。从 Oracle 的 this excellent tutorial 处了解更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。