簡體   English   中英

Java日期比較

[英]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");

TL;博士

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

現代方法使用了java.time類, 該類取代了非常麻煩的舊日期時間類,例如Date / Calendar

另外,您正在使用帶日期的時間類型來表示僅日期的值。 而是使用LocalDate僅日期類。

今天

時區對於確定日期至關重要。 在任何給定時刻,日期都會在全球范圍內變化。 例如, 法國巴黎午夜過后幾分鍾是新的一天,而在魁北克蒙特利爾仍然是“昨天”。

如果未指定時區,則JVM隱式應用其當前的默認時區。 該默認值可能會在運行時(!)期間隨時更改 ,因此您的結果可能會有所不同。 最好將[期望/預期時區] [2]明確指定為參數。

continent/region的格式指定正確的時區名稱 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 切勿使用ESTIST等3-4個字母的縮寫,因為它們不是真實的時區,不是標准化的,甚至不是唯一的(!)。

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

對比

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

isBeforeisAfterisEqual方法進行比較。

使用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.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

現在處於維護模式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中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM