在JAVA中计算两个日期之间的天数(catch ParseException错误)
我正在计算两次约会之间的天数。当我运行它时,它抛出捕获(ParseException ex)。在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) {
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
中不工作。噢!我的错。我没有注意到。你说得对。谢谢