java中两个日期字符串之间的区别

时间:2011-06-01 20:23:49

标签: java

我正在尝试计算两个日期字符串之间的差异,这两个日期字符串都来自用户通过格式的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映射到“检查日期”

因此,问题是为两个日期字符串的任何值打印“检查日期”错误。

6 个答案:

答案 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)

TL;博士

java.lang.Math.abs (
    ChronoUnit.DAYS.between(
        LocalDate.parse( "2017/01/23".replace( "/" , "-" ) ) ,
        LocalDate.parse( "2017/02/14".replace( "/" , "-" ) ) 
    )
) > 3L

使用java.time

现代方法使用java.time类而不是麻烦的旧遗留日期时间类(DateCalendar等)。

您的输入字符串几乎符合仅限日期值的标准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表示3Llong类型的三个原始值。编译器可能会将3的默认值从int(32位)升级到long(64位),但我更喜欢使用3L来明确。< / p>

if( abs( daysBetween ) > 3L ) { … }

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore