我正在尝试使用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。
答案 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)
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 类取代了麻烦的旧日期时间类,例如Date
/ Calendar
。
此外,您正在使用带日期的时间类型来表示仅日期的值。而是使用LocalDate
仅日期类。
时区对于确定日期至关重要。在任何给定时刻,日期都会在全球范围内变化。例如,Paris France午夜之后的几分钟是新的一天,而Montréal Québec仍然是“昨天”。
如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将您的[期望/期望时区] [2]明确指定为参数。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用3-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
LocalDate start = LocalDate.parse( "2014-07-08" ) ;
LocalDate stop = LocalDate.parse( "2015-02-28" ) ;
与isBefore
,isAfter
和isEqual
方法进行比较。
使用半开方法(开始为包含,而结束为排他)定义时间跨度。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。