[英]Expiring date today in Java
我需要檢查給定日期是否在今天23:59:59之后,如何創建今天23:59:59的日期對象?
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嗎?”。
如果是這樣,請不要擔心確定當天的最后一刻; 由於分數秒,這是不切實際的。 最好只關注日期,而不是一天中的時間。 您想知道給定時刻的僅日期是否僅在當前時刻的日期之后。 時區在這里至關重要。
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 8及更高版本中。 這些類取代了麻煩的舊日期時間類,如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time。
要了解更多信息,請參閱Oracle教程 。 並搜索Stack Overflow以獲取許多示例和解釋。
大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的Android在ThreeTenABP (見如何使用...... )。
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的課程,如Interval
, YearWeek
, YearQuarter
等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.