Java日期比较

时间:2015-02-19 14:31:16

标签: java date date-comparison

我正在尝试使用java.util.Date和java.util.Calendar来比较日期,但由于某些原因我似乎没有得到正确的结果。我的代码:

DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
String currentDate = "2014-10-04";
String startDate = "2014-07-08";
String endDate = "2015-02-28";
Calendar cDate = Calendar.getInstance();  
cDate.setTime(df.parse(currentDate));
Calendar sDate = Calendar.getInstance();  
sDate.setTime(df.parse(startDate));
Calendar eDate = Calendar.getInstance();  
eDate.setTime(df.parse(endDate));
System.out.println(cDate.compareTo(sDate));
System.out.println(cDate.after(sDate));

正如您所看到的,after应返回true但返回false。

4 个答案:

答案 0 :(得分:4)

SimpledateFormat的模式不正确:mm指定当天的分钟。使用yyyy-MM-dd即可。

请参阅http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

答案 1 :(得分:1)

你是否解决了改变问题" yyyy-mm-dd"到" yyyy-MM-dd"如前所述。

我运行代码:

public static void main(String[] args) throws ParseException {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String currentDate = "2014-10-04";
        String startDate = "2014-07-08";
        String endDate = "2015-02-28";
        Calendar cDate = Calendar.getInstance();
        cDate.setTime(df.parse(currentDate));
        Calendar sDate = Calendar.getInstance();
        sDate.setTime(df.parse(startDate));
        Calendar eDate = Calendar.getInstance();
        eDate.setTime(df.parse(endDate));
        System.out.println(cDate.compareTo(sDate));
        System.out.println(cDate.after(sDate));
    }

结果是:

1
true

答案 2 :(得分:0)

问题在于您的SimpleDateFormat模式:http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

M   Month in year   
m   Minute in hour

在您的代码中:

cDate = 2014-01-04 00:10:00
sDate = 2014-01-08 00:07:00

您应该使用:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

答案 3 :(得分:0)

tl; dr

org.threeten.extra.LocalDateRange                      // Represents a pair of `LocalDate` objects as a date range.
.of(
    LocalDate.parse( "2014-07-08" ) ,                  // Parse your input strings. The standard ISO 8601 format is used by default, so no need to specify a formatting pattern.
    LocalDate.parse( "2015-02-28" ) 
)                                                      // Returns a `LocalDateRange` object.
.contains(
    LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )   // Capture the current date as seen in the wall-clock time used by the people of a particular region.
)                                                      // Returns boolean primitive.
  

false

java.time

现代方法使用 java.time 类取代了麻烦的旧日期时间类,例如Date / Calendar

此外,您正在使用带日期的时间类型来表示仅日期的值。而是使用LocalDate仅日期类。

今天

时区对于确定日期至关重要。在任何给定时刻,日期都会在全球范围内变化。例如,Paris France午夜之后的几分钟是新的一天,而Montréal Québec仍然是“昨天”。

如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将您的[期望/期望时区] [2]明确指定为参数。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;

比较

LocalDate start = LocalDate.parse( "2014-07-08" ) ;
LocalDate stop = LocalDate.parse( "2015-02-28" ) ;

isBeforeisAfterisEqual方法进行比较。

使用半开方法(开始为包含,而结束为排他)定义时间跨度。

Boolean contains = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;

LocalDateRange

如果要完成很多工作,请将 ThreeTen-Extra 库添加到您的项目中。这为您提供了LocalDateRange类。

LocalDateRange range = LocalDateRange.of( start , stop ) ;
Boolean contains = range.contains( today ) ;

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore