[英]Java Built In Date Manipulation and Comparison
我想創建一個日期時間戳,然后向其添加10個小時,然后進行線程檢查以查看時間是否已經過去。
我讀了一下, 時間比較,但是對於這么簡單的事情似乎有點復雜/復雜。 特別是如果您的時間比較是午夜。
我的理解是,java的基礎日期時間假設是一個很長的時間(如果是這樣),是否有一種簡單的方法為其添加另一個長的時間,例如等於10小時的數字? 還是其他一些方法,例如添加兩個日期?
注意:該解決方案必須是核心Java的一部分,不能成為第三方庫的一部分。
您可以使用日歷來執行該數學運算,
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, 10); // Add 10 hours.
Date date2 = cal.getTime(); // Now plus 10 hours.
Date date = new Date(); // Now.
您可以使用Date.getTime()
方法獲取基礎時間戳,該時間戳基本上是自定義的基本時刻(1970-01-01 00:00:00 IIRC)起經過的毫秒數。
System.currentTimeMillis()
允許您直接獲取“現在”即時信息,而無需使用Date
, Calendar
等進行繞行。
然后可以對時間戳進行基本數學運算:
timestamp += TimeUnit.MILLISECONDS.convert(10, TimeUnit.HOURS);
加10小時的示例:
long nowInMilliSince1970 = System.currentTimeMillis();
long tenHoursAsMilli = TimeUnit.MILLISECONDS.convert(10L, TimeUnit.MINUTES);
long tenHoursLater = nowInMilliSince1970 + tenHoursAsMilli;
System.out.println("now in milliseconds: \t\t" + nowInMilliSince1970);
System.out.println("10 hours in milliseconds: \t" + tenHoursAsMilli);
System.out.println("10 hours from now: \t\t" + tenHoursLater);
檢查時間戳是否過去很容易:
if (timestamp < System.currentTimeMillis()) {
System.out.println("timestamp is in the past");
}
請注意,直接時間戳數學沒有夏令時和時區的概念。 如果需要,請使用日歷進行數學運算- Calendar
為此實現了骯臟的例外規則。
僅使用內置的JDK來實現此目標的另一種方法是:
long tenHoursFromNow = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(10);
然后在您的線程中檢查:
if(System.currentTimeMillis() > tenHoursFromNow)
{
//Do something as the time has elapsed
}
盡管我認為使用Calendar和Date可以更清楚地了解代碼的意圖。
捆綁的java.util.Date和.Calendar非常麻煩。 確實應該避免它們。
您聲明了不添加任何庫的要求。 因此,請使用新添加到Java 8中的新程序包來查看答案的java.time部分。但是,我敦促您重新考慮不願添加庫的情況,特別是如果您現在還不能遷移到Java 8時,尤其如此。 juDate / Calendar真的很糟糕。
這兩個庫都處理諸如夏令時之類的異常。
考慮指定時區,而不要依賴JVM的默認時區。 通常最好在UTC中工作,然后轉換為本地時區以呈現給用戶。
java.time軟件包是新添加到Java 8中的 。 受Joda-Time啟發,但重新設計。 由JSR 310定義。 由threeten-extra項目擴展。
ZonedDateTime tenHoursLater = ZonedDateTime.now().plusHours( 10 );
使用Joda-Time 2.3庫。
DateTime tenHoursLater = DateTime.now().plusHours( 10 );
有關使用Joda-Time的更多信息,請參閱我對類似問題的回答。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.