簡體   English   中英

在 Java 中,如何獲得兩個日期之間的秒數差異?

[英]In Java, how do I get the difference in seconds between 2 dates?

Java 類庫有一個名為 DateTime 的類。 DateTime 有這個方法:

int daysBetween(DateTime other)

它返回 this 和參數之間的天數。 它沒有方法

int secondsBetween(DateTime other)

我碰巧需要。 有沒有類似於 DateTime 但有這樣一個方法的類?

不熟悉日期時間...

如果您有兩個日期,您可以在它們上調用 getTime 以獲取毫秒,獲取差異並除以 1000。例如

Date d1 = ...;
Date d2 = ...;
long seconds = (d2.getTime()-d1.getTime())/1000;

如果您有日歷對象,您可以調用

c.getTimeInMillis()

並做同樣的事情

我想提供現代答案。 當被問到這個問題時,其他答案都很好,但時間在繼續。 今天我推薦你使用java.time ,現代的 Java 日期和時間 API

    ZonedDateTime aDateTime = ZonedDateTime.of(2017, 12, 8, 19, 25, 48, 991000000, ZoneId.of("Europe/Sarajevo"));
    ZonedDateTime otherDateTime = ZonedDateTime.of(2017, 12, 8, 20, 10, 38, 238000000, ZoneId.of("Europe/Sarajevo"));

    long diff = ChronoUnit.SECONDS.between(aDateTime, otherDateTime);
    System.out.println("Difference: " + diff + " seconds");

這打印:

Difference: 2689 seconds

ChronoUnit.SECONDS.between()與兩個ZonedDateTime對象或兩個OffsetDateTime 、兩個LocalDateTime等一起使用。

如果您需要的不僅僅是幾秒鍾,您應該考慮使用Duration類:

    Duration dur = Duration.between(aDateTime, otherDateTime);
    System.out.println("Duration: " + dur);
    System.out.println("Difference: " + dur.getSeconds() + " seconds");

這打印:

Duration: PT44M49.247S
Difference: 2689 seconds

兩行中的前者以 ISO 8601 格式打印持續時間,輸出表示持續時間為 44 分 49.247 秒。

為什么選擇 java.time?

其他幾個答案中使用的Date類現在已經過時了。 Joda-Time 也用於一對夫婦(可能在問題中)現在處於維護模式,沒有計划進行重大改進,開發人員正式建議遷移到java.time ,也稱為 JSR-310。

問:我可以在我的 Java 版本中使用現代 API 嗎?

如果至少使用 Java 6 ,則可以。

你應該做

org.joda.time.Seconds.secondBetween(date1, date2)

那應該這樣做:

Date a = ...;
Date b = ...;

Math.abs(a.getTime()-b.getTime())/1000;

這里是相關文檔: Date.getTime() 請注意,這僅適用於 1970 年 1 月 1 日 00:00:00 GMT 之后的日期

標准 Java SE API 中沒有DateTime這樣的類。 盡管在 joda-time 中有一個,但即使這樣也沒有daysBetween方法。

使用標准 Java API,獲得兩個java.util.Date對象之間秒數的最簡單方法是減去它們的時間戳並除以 1000:

int secondsBetween = (date1.getTime() - date2.getTime()) / 1000;

您可以使用org.apache.commons.lang.time.DateUtils使其更清潔:

(firstDate.getTime() - secondDate.getTime()) / DateUtils.MILLIS_PER_SECOND

不建議使用java.util.DateSystem.currentTimeMillis()來測量經過的時間。 這些日期不保證是單調的,並且會在修改系統時鍾時發生變化(例如,從服務器更正時)。 這種情況很可能很少發生,但為什么不編寫更好的解決方案而不是擔心可能出現負面或非常大的變化呢?

相反,我會推薦使用System.nanoTime()

long t1 = System.nanoTime();
long t2 = System.nanoTime();

long elapsedTimeInSeconds = (t2 - t1) / 1000000000;

編輯

有關單調性的更多信息,請參閱我提出的相關問題的答案,nanoTime 在可能的情況下使用單調時鍾。 我已經測試過,但只使用了 Windows XP、Java 1.6 並修改了nanoTime是單調的而currentTimeMillis不是的時鍾。

同樣來自Java 的實時文檔

Q: 50. 實時時鍾返回的時間是否比System.nanoTime()返回的分辨率更好?

實時時鍾和 System.nanoTime() 都基於相同的系統調用,因此是相同的時鍾。

使用 Java RTS,所有基於時間的 API(例如,計時器、定期線程、截止日期監控等)都基於高分辨率計時器。 並且,與實時優先級一起,它們可以確保在正確的時間執行適當的代碼以實現實時約束。 相比之下,普通的 Java SE API 只提供了一些能夠處理高分辨率時間的方法,並且不能保證在給定時間執行。 在代碼中的各個點之間使用 System.nanoTime() 來執行經過時間的測量應該總是准確的。

如果您使用的是 Joda(它可能在 JDK 7 中以 jsr 310 的形式出現,在此之前是單獨的開源 api),那么有一個帶有 secondsBetween 方法的 Seconds 類。

這是 javadoc 鏈接:http://joda-time.sourceforge.net/api-release/org/joda/time/Seconds.html#secondsBetween(org.joda.time.ReadableInstant, %20org.joda.time.ReadableInstant)

對於 java 8+,您可以使用

ChronoUnit.SECONDS.between(temporal1,temporal2)

哪一堂課 ? 你是說 JodaDateTime類嗎? 如果是這樣,您可以簡單地對每個調用getMillis()並執行適當的減法/縮放。

順便說一句,我會推薦 Joda 用於日期/時間工作,因為它有用且直觀的 API,以及它的格式化/解析選項的線程安全性。

只是一個指針:如果您正在計算兩個 java.util.Date 之間的差異,則將兩個日期相減並除以 1000 的方法是合理的,但如果您從 Calendar 對象獲取 java.util.Date 引用,請特別注意. 如果這樣做,則需要考慮 TimeZone 的夏令時,因為您使用的日期之一可能發生在 DST 期間。

Prasoon 的鏈接對此進行了解釋,我建議您花一些時間閱讀它。

使用此方法:

private Long secondsBetween(Date first, Date second){
    return (second.getTime() - first.getTime())/1000;
}

使用時間單位類。

long timeDifferentInSeconds = TimeUnit.MILLISECONDS.toSeconds(currentDate.getTime()) - TimeUnit.MILLISECONDS.toSeconds(previousDate.getTime());

暫無
暫無

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

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