簡體   English   中英

Java-計算時差-特定方案

[英]Java - Calculating hour difference - specific scenario

我只想以分鍾為單位計算時差,希望已經有一個可以正確執行的類。 因此,我從網站獲得的值僅是Hours and Minutes(例如:event在20:30 開始 ,在03:30 結束 )。

當我使用“ Duration.between”時,我得到的值不正確-當第一個值大於第二個值或第二個值是午夜之后時,就會發生這種情況。 我想我可以使用'ifs'和'elses'來做到這一點,但我確信已經有一個類或方法可以用更優雅的方式解決問題,但是我找不到。 這是我的代碼:僅當第二個值大於第一個值時,它才起作用:

        LocalTime eventStarts = LocalTime.now();
        LocalTime eventEnds = LocalTime.now();
        eventStarts = eventStarts.withHour(22).withMinute(00);
        eventEnds = eventEnds.withHour(03).withMinute(00);

        Duration durationBetweenEvents =  Duration.between(eventStarts, eventEnds);


        System.out.println(durationBetweenEvents.toMinutes());

在這種情況下,我得到“ -1140”

只需將以下內容添加到您的代碼中即可。

if (durationBetweenEvents.isNegative()) {
    durationBetweenEvents = durationBetweenEvents.plusDays(1);
}

您必須對日光節約有所注意。 如果夏令時在兩個事件之間開始或結束,則您的計算可能會花費一個小時。 但是,如果不知道日期或時區信息,就無法解決。

需要日期和時區

LocalTime沒有日期或天的概念。 因此,僅限一天24小時通用。 從晚上時間到早晨時間被認為是時間倒退,而不是因為沒有日子而繞到另一天。

要了解實際事件的持續時間,您需要日期和時區。

獲取當前日期需要一個時區。 在任何給定時刻,日期都會在全球范圍內變化。

擁有日期后,請應用ZoneId以獲取ZonedDateTime對象。 從那里,您可以獲取考慮到異常的Duration ,例如夏令時(DST)。

ZoneId z = ZoneId.of( "America/Montreal" );

LocalDate today = LocalDate.now( z );
LocalDate tomorrow = today.plusDays( 1 );

ZonedDateTime zdtStart = 
    ZonedDateTime.of( today , LocalTime.parse( "20:30" ) , z ) ;
ZonedDateTime zdtStop = 
    ZonedDateTime.of( tomorrow , LocalTime.parse( "03:30" ) , z ) ;

Duration d = Duration.between( zdtStart , zdtStop ) ;

long totalMinutes = d.toMinutes() ; 

zdtStart.toString():2017-04-13T20:30-04:00 [美國/蒙特利爾]

zdtStop.toString():2017-04-14T03:30-04:00 [美國/蒙特利爾]

d.toString():PT7H

總分鍾數:420

看到此代碼在IdeOne.com上實時運行

暫無
暫無

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

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