亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我如何轉換兩個 Calendar 對象之間的確切時間量(年、月、日、小時、分鐘、秒)?

我如何轉換兩個 Calendar 對象之間的確切時間量(年、月、日、小時、分鐘、秒)?

蠱毒傳說 2023-06-14 14:39:03
我試圖隱藏 Java 中兩個 Calendar 對象之間的確切時間量。這是我目前擁有的代碼......public static Map<TimeUnit, Long> computeDifference(Calendar date1, Calendar date2) {     long diffInMillies = date2.getTimeInMillis() - date1.getTimeInMillis();    //create the list    List<TimeUnit> units = new ArrayList<TimeUnit>();    units.add(TimeUnit.SECONDS);    units.add(TimeUnit.MINUTES);    units.add(TimeUnit.HOURS);    units.add(TimeUnit.DAYS);    Collections.reverse(units);    //create the result map of TimeUnit and difference    Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>();    long milliesRest = diffInMillies;    for ( TimeUnit unit : units ) {        //calculate difference in millisecond         long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS);        long diffInMilliesForUnit = unit.toMillis(diff);        milliesRest = milliesRest - diffInMilliesForUnit;        //put the result in the map        result.put(unit,diff);    }    return result;}   打印時,輸出看起來像這樣{DAYS=1, HOURS=10, MINUTES=30, SECONDS=45}輸入date1 = 19 August 2019 02:00:00和date2 = 20 August 2019 12:30:45此方法中可用的最大時間單位是DAYS,但我想找到同時包含月份和年份的內容。我意識到 TimeUnit 與特定的日歷日期(而不是 24 小時間隔)沒有任何關系,這就是為什么我想知道是否有任何方法可以使用 Calendar 類或類似的東西進行這種轉換。我還研究了 ChronoUnit 作為 TimeUnit 的替代品,但由于 TimeUnit 不起作用的相同原因,它不起作用。會喜歡關于如何合并更大的時間單位的任何建議。謝謝你!
查看完整描述

2 回答

?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

你不應該使用這個Calendar類,因為它已經過時了。您應該改用java.time包中的類。

為了獲得所需的結果,您可以使用該類Period。

您首先需要將兩個Calendar實例都轉換為LocalDateinstances。

然后您可以使用Period.between(startDate, endDate)to 獲取一個Period實例,這使得getDays()getMonths()方法getYears()對您可用。


如果您還想包括時間組件(小時、分鐘和秒),那么您可以Duration結合使用Period.?

這樣的事情可能會起作用:

LocalDateTime start = LocalDateTime.of(2019, 1, 1, 12, 0, 0);

LocalDateTime end = LocalDateTime.of(2021, 4, 26, 5, 56, 40);


Duration d = Duration.between(start.toLocalTime(), end.toLocalTime());

Period p = Period.between(start.toLocalDate(), end.toLocalDate());


// If the startdate's time component lies behind the enddate's time component,

// then we need to correct both the Period and Duration

if (d.isNegative()) {

? ? p = p.minusDays(1);

? ? d = d.plusDays(1);

}


System.out.printf("y %s m %s d %s h %s m %s s %s%n",

? ? p.getYears(),

? ? p.getMonths(),

? ? p.getDays(),

? ? d.toHours() % 24,

? ? d.toMinutes() % 60,

? ? d.getSeconds() % 60);

請注意,Java 9 附帶to…Part方法,因此您不必再使用模運算符。


請注意:由于夏令時,此代碼未考慮時鐘調整。


查看完整回答
反對 回復 2023-06-14
?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

Period

.between(

? ? ( ( GregorianCalendar ) myCalStart ).toZonedDateTime().toLocalDate() ,

? ? ( ( GregorianCalendar ) myCalStop ).toZonedDateTime().toLocalDate()?

)

…或者…


Duration

.between(

? ? ( ( GregorianCalendar ) myCalStart ).toInstant() ,

? ? ( ( GregorianCalendar ) myCalStop ).toInstant()?

)

java.time

您正在使用多年前被 JSR 310 中定義的現代java.time類所取代的可怕的日期時間類。

切勿使用Calendar,?GregorianCalendar,?Date,SimpleDateFormat等。僅使用在java.time包中找到的類。

ZonedDateTime

假設您的兩個Calendar對象實際上都是GregorianCalendar下面的對象,請轉換。要進行轉換,請調用添加到舊類的新to…/方法。from…


// start

GregorianCalendar gcStart = ( GregorianCalendar ) myCalStart ;

ZonedDateTime zdtStart = gcStart.toZonedDateTime() ;


// stop

GregorianCalendar gcStop = ( GregorianCalendar ) myCalStop ;

ZonedDateTime zdtStop = gcStop.toZonedDateTime() ;

和 都GregorianCalendar代表ZonedDateTime一個日期和一個時區上下文中的時間,結合起來確定一個時刻(時間軸上的特定點)。ZonedDateTime解析到更精細的納秒級而不是毫秒級。

Period

如果您關心以年-月-日為單位的經過時間,請使用Period對象LocalDate。LocalDate表示沒有時間和時區的日期。我們可以從我們的對象中提取日期部分ZonedDateTime。

LocalDate ldStart = zdtStart.toLocalDate() ;

LocalDate ldStop = zdtStop.toLocalDate() ;

Period p = Period.between( ldStart , ldStop ) ;

生成標準ISO 8601格式的字符串。


String output = p.toString() ;

詢問數年、數月、數日。


int years = p.getYears() ;

int months = p.getMonths() ;

int days = p.getDays() ;

Duration

如果您以小時-分鐘-秒的形式計算經過的時間,請使用Duration.?此類代表 UTC 中的一對時刻。因此,我們Instant從我們的ZonedDateTime對象對中提取對象,這些對象在內部保留自 UTC 1970 年第一時刻的紀元參考以來的整秒計數,加上小數秒作為納秒計數。

Instant instantStart = zdtStart.toInstant() ;

Instant instantStop = zdtStop.toInstant() ;

Duration d = Duration.between( instantStart , instantStop ) ;

生成標準ISO 8601格式的字符串。


String output = d.toString() ;

查詢天數(與日歷無關的 24 小時時間塊)、小時、分鐘、秒。


long days = d.toDaysPart() ;

int hours = d.toHoursPart() ;

int minutes = d.toMinutesPart() ;

int seconds = d.toSecondsPart() ;

int nanos = d.toNanosPart() ;

PeriodDuration

如果您考慮一下,您會發現將年/月/日與 24 小時-日/小時/分鐘/秒結合起來是沒有意義的。

http://img2.sycdn.imooc.com/648960ef00014a8606520413.jpg

查看完整回答
反對 回復 2023-06-14
  • 2 回答
  • 0 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號