[英]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.