[英]Java 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。
您的SimpledateFormat
模式不正確: mm
指定一天中的分鍾。 使用yyyy-MM-dd
。
參見http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
您是否解決了先前回答的將“ 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
問題出在您的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");
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.
假
現代方法使用了java.time類, 該類取代了非常麻煩的舊日期時間類,例如Date
/ Calendar
。
另外,您正在使用帶日期的時間類型來表示僅日期的值。 而是使用LocalDate
僅日期類。
時區對於確定日期至關重要。 在任何給定時刻,日期都會在全球范圍內變化。 例如, 法國巴黎午夜過后幾分鍾是新的一天,而在魁北克蒙特利爾仍然是“昨天”。
如果未指定時區,則JVM隱式應用其當前的默認時區。 該默認值可能會在運行時(!)期間隨時更改 ,因此您的結果可能會有所不同。 最好將[期望/預期時區] [2]明確指定為參數。
以continent/region
的格式指定正確的時區名稱 ,例如America/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 切勿使用EST
或IST
等3-4個字母的縮寫,因為它們不是真實的時區,不是標准化的,甚至不是唯一的(!)。
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
方法進行比較。
使用Half-Open方法(開頭為inclusive ,結尾為Exclusive )來定義時間跨度。
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及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time類。
要了解更多信息,請參見Oracle教程 。 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310 。
您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 。 不需要字符串,不需要java.sql.*
類。
在哪里獲取java.time類?
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.