簡體   English   中英

今天即將到期的Java日期

[英]Expiring date today in Java

我需要檢查給定日期是否在今天23:59:59之后,如何創建今天23:59:59的日期對象?

使用java.util.Calendar

Calendar cal = Calendar.getInstance(); // represents right now, i.e. today's date
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999); // credit to f1sh

Date date = cal.getTime();

不過,我認為你可能會從一個錯誤的角度接近這個。 而不是嘗試在午夜之前創建一個原子的Date實例,更好的方法可能是創建表示午夜的Date並測試當前時間是否嚴格小於它。 我相信,就你對其他人閱讀代碼的意圖而言,這會更加清晰。


或者,您可以使用知道如何轉換回日期的第三方Date API。 Java的內置日期API通常被認為在許多方面存在缺陷。 我不建議使用另一個庫來執行此操作,但如果您必須進行大量日期操作和/或已經使用像Joda Time這樣的庫,您可以更簡單地表達這個概念。 例如,Joda Time有一個DateMidnight類,它允許更容易地比較你正在進行的類型的“原始”日期,而不會出現細微的問題(比如在我的第一次剪切中沒有設置毫秒)。

這將在未來創建一個日期,並將其與當前日期(設置為深夜)進行比較。 您應該考慮使用Joda時間庫。

long timeStampOfTomorrow = new Date().getTime() + 86400000L;
Date dateToCheck = new Date(timeStampOfTomorrow);


Calendar today = Calendar.getInstance();
today.set(Calendar.HOUR_OF_DAY, 23);
today.set(Calendar.MINUTE, 59);
today.set(Calendar.SECOND, 59);
today.set(Calendar.MILLISECOND, 999);

boolean isExpired = dateToCheck.after(today.getTime());

使用Joda Time Library,您可以更加可讀。 可以在項目網站上找到一個簡單的例子。

public boolean isRentalOverdue(DateTime datetimeRented) {
    Period rentalPeriod = new Period().withDays(2).withHours(12);
    return datetimeRented.plus(rentalPeriod).isBeforeNow();
}

使用 Date.before(Date)或Date.after(Date)

Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 23);
c.set(Calendar.SECOND, 59);
c.set(Calendar.MINUTE, 59);

Date d = c.getTime()

Date x = // other date from somewhere

x.after(d);

找到明天的日期將其轉換為毫秒,你得到一個很長的價值。 從中減去-1並再次轉換為日期,您將獲得所需的日期。

例如:明天的12:00:00將其轉換為毫秒。 你會得到一個很長的值312313564774減去-1你將得到今天的時間以毫秒為單位

我假設你的意思是“今天之后是給定的java.util.Date嗎?”。

如果是這樣,請不要擔心確定當天的最后一刻; 由於分數秒,這是不切實際的。 最好只關注日期,而不是一天中的時間。 您想知道給定時刻的僅日期是否僅在當前時刻的日期之后。 時區在這里至關重要。

TL;博士

ZoneId z = ZoneId.of( “America/Montreal” );  // Time zone determines date.
Boolean givenMomentIsAfterToday = myUtilDate.toInstant().atZone( z ).toLocalDate().isAfter( LocalDate.now( z ) );

細節

您正在使用現在由java.time類取代的麻煩的舊日期時間類。

首先,將給定的java.util.Date轉換為Instant 查找添加到舊類的新轉換方法,以便轉換為/從java.time類型轉換。

Instant

Instant類表示UTC時間軸上的一個時刻,分辨率為納秒

Instant instant = myUtilDate.toInstant();

LocalDate

LocalDate類表示沒有時間且沒有時區的僅日期值。

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

ZoneId z = ZoneId.of( “America/Montreal” );
LocalDate today = LocalDate.now( z );

ZonedDateTime

將瞬間調整到相同的時區以進行日期比較。

ZonedDateTime zdt = instant.atZone( z );

詢問僅限日期的值,即LocalDate

LocalDate ldt = zdt.toLocalDate();

最后,比較LocalDate對象。

Boolean givenMomentIsAfterToday = ldt.isAfter( today );

關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊日期時間類,如java.util.Date.Calendarjava.text.SimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time。

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的AndroidThreeTenABP (見如何使用...... )。

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的課程,如IntervalYearWeekYearQuarter等。

暫無
暫無

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

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