从字符串解析日期但得到错误的值

时间:2014-04-16 20:53:14

标签: java string date

所以,我想比较两个日期,如果一个日期在另一个日期之后,我有一个if循环。我的方法:

开始日期和结束日期是用户输入的变量,格式为月/日/年。

String startDate = "02/20/2012";
String endDate = "03/20/2012";

Date startDate1 = new SimpleDateFormat("MM/dd/yyyy").parse(startDate);
Date endDate1 = new SimpleDateFormat("MM/dd/yyyy").parse(endDate);

然而,startDate1显示了这一点:Mon Feb 20 00:00:00 EST 2012 和,     endDate1显示:Tue Mar 20 00:00:00 EDT 2012

我不明白我在这里做错了什么。

循环:     if (endDate1.after(startDate1)){ blah blah blah }

4 个答案:

答案 0 :(得分:2)

你没有做错任何事,这是java中Date对象的默认toString()表示格式

答案 1 :(得分:0)

用它来比较两个日期。

if(startDate1.compareTo(endDate1)>0){
     System.out.println("Date1 is after Date2");
}else if(startDate1.compareTo(endDate1)<0){
     System.out.println("Date1 is before Date2");
}else if(startDate1.compareTo(endDate1)==0){
     System.out.println("Date1 is equal to Date2");
}else{
     System.out.println("How to get here?");
     }

答案 2 :(得分:0)

您使用MM/dd/yyyy指定的内容是将用户输入正确转换为日期的输入格式。什么是&#34;显示&#34; (通过调试器?)是toString方法返回的输出格式。

但该日期实际上存储为自1970年1月1日00:00:00 GMT以来经过的整数毫秒数。

答案 3 :(得分:-1)

您看到了正确的行为。 java.util.Date对象具有日期部分和时间部分。该对象没有时区,但toString方法在生成字符串时会混淆地应用JVM的默认时区。

与Java捆绑在一起的java.util.Date和.Calendar类非常麻烦。避免他们。使用一个体面的日期时间库。对于Java,这意味着Joda-Time或Java 8中的新java.time包(受Joda-Time启发,由JSR 310定义)。

如果您确定不需要时间或时区,Joda-Time会提供LocalDate类。注意:天真的程序员通常认为他们不需要时间或时区,但后来后悔这个决定。

使用Joda-Time 2.3的示例代码。

String startInput = "02/20/2012";
String stopInput = "03/20/2012";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MM/dd/yyyy" );

LocalDate start = formatter.parseLocalDate( startInput );
LocalDate stop = formatter.parseLocalDate( stopInput );
boolean isStopAfterStart = stop.isAfter( start );

转储到控制台...

System.out.println( "start: " + start );
System.out.println( "stop: " + stop );
System.out.println( "isStopAfterStart: " + isStopAfterStart );

跑步时......

start: 2012-02-20
stop: 2012-03-20
isStopAfterStart: true