簡體   English   中英

Java內置日期操作和比較

[英]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()允許您直接獲取“現在”即時信息,而無需使用DateCalendar等進行繞行。

然后可以對時間戳進行基本數學運算:

 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.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.

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