我正在尝试计算两个日期字符串之间的差异,这两个日期字符串都来自用户通过格式的html表单(yyyy / MM / dd) 代码:
public boolean diffDate() throws ParseException
{
date1 = getissuedate();
date2 = getduedate();
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy/MM/dd");
SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy/MM/dd");
Date date_old = formatter1.parse(date1);
Date date_new = formatter2.parse(date2);
long milis1 = date_old.getTime();
long milis2 = date_new.getTime();
long diff = milis2 - milis1;
if( diff<3 || diff>3)
{
return true;
}
else
{
return false;
}
}
如果日期之间的差异不等于3,我现在正在使用if条件报告网页中的错误。 代码:
try {
if(diffDate())
{
errors.add("duedate", new ActionMessage("error.duedate.required"));
}
} catch (ParseException ex) {
Logger.getLogger(IssueBookForm.class.getName()).log(Level.SEVERE, null, ex);
}
其中error.duedate.required映射到“检查日期”
因此,问题是为两个日期字符串的任何值打印“检查日期”错误。
答案 0 :(得分:2)
您正在测试两个日期是否相差3毫秒,这几乎总是正确的。如果你真的想要3天,那么价值应该是3 * 86400 * 1000。如果您关心闰秒和日光节省时间的变化会发生什么,那么问题会变得更加复杂。
答案 1 :(得分:1)
你的条件差异&lt; 3 || diff> 3相当于diff!= 3,diff以毫秒表示。这种表达永远不会成真。
答案 2 :(得分:1)
如果您使用1天的分辨率解析日期,即86.000.000毫秒,您将永远不会遇到3毫秒不同的情况。
getTime()返回自“纪元开始”以来的毫秒时间,因此返回毫秒或1/1000秒。
diff < 3 || diff > 3
与
相同diff != 3
如果您想检测3天不同的日期,您可以将millis数除以比较前的ms /天数。
答案 3 :(得分:1)
从yyyy / MM / dd格式化字符串获得的两个日期之间,你永远不会得到正好3 毫秒的差异(最高准确度为24小时)
如果您想要3天的差异,请使用24*60*60*1000
作为缩放值的因素
答案 4 :(得分:1)
java.util.Calendar有一个方法add
,它接受一个数量和一个单位的时间,以及一个名为compareTo
的方法,它采用另一个日历。你应该使用那些。
答案 5 :(得分:0)
java.lang.Math.abs (
ChronoUnit.DAYS.between(
LocalDate.parse( "2017/01/23".replace( "/" , "-" ) ) ,
LocalDate.parse( "2017/02/14".replace( "/" , "-" ) )
)
) > 3L
现代方法使用java.time类而不是麻烦的旧遗留日期时间类(Date
,Calendar
等)。
您的输入字符串几乎符合仅限日期值的标准ISO 8601格式:YYYY-MM-DD。要完全符合要求,请使用连字符替换斜杠字符。
String inputA = "2017/01/23".replace( "/" , "-" ) ;
String inputB = "2017/02/14".replace( "/" , "-" ) ;
默认情况下,java.time类在解析/生成字符串时使用标准格式。因此无需指定格式化模式。
LocalDate ldA = LocalDate.parse( inputA );
LocalDate ldB = LocalDate.parse( inputB );
你的问题的其余部分没有意义,因为它测试的是+/- 3毫秒,这在日期之间是不可能的。显然你打算检查一下天数。为此,请使用ChronoUnit
枚举。
long daysBetween = ChronoUnit.DAYS.between( ldA , ldB );
如果第二个日期实际发生在之前第一个日期,则结果为负数。您似乎想要测试任何一种情况,使用±3的容差。使用java.lang.Math
类'abs
方法测试结果的绝对值。
ChronoUnit.DAYS.between
方法返回long
原语。因此,我们将该结果与我们的极限值3进行比较的测试必须与该类型匹配请注意使用L
表示3L
是long
类型的三个原始值。编译器可能会将3
的默认值从int
(32位)升级到long
(64位),但我更喜欢使用3L
来明确。< / p>
if( abs( daysBetween ) > 3L ) { … }
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。