[英]Round date long value
在我的Java項目中,我使用了long
日期,例如,它是12136219
並通過創建Date
對象,如下所示:
long time = 12136219;
Date date = new Date(time);
並將日期表示為Thu Jan 01 04:22:16 CET 1970
日Thu Jan 01 04:22:16 CET 1970
。 如何將日期(長時表示)四舍五入為分鍾?
例如,如果秒數<30
,我想達到Thu Jan 01 04:22:00 CET 1970
<30
Thu Jan 01 04:23:00 CET 1970
如果秒數>=30
Thu Jan 01 04:23:00 CET 1970
<30
,則想達到Thu Jan 01 04:22:00 CET 1970
<30
Thu Jan 01 04:23:00 CET 1970
,但是我想舍入這個long time = 12136219
。 任何想法?
從long
創建Date
,long表示自1970年1月1日以來的毫秒數。每分鍾有60 * 1000毫秒。 這應該是足夠的信息,以構成所需的舍入算法。
由於時間是“自標准基准時間稱為“紀元”以來的毫秒數,即1970年1月1日,格林尼治標准時間”,您可以這樣計算秒數:
secondsInMillis = time % (60 * 1000) //get remainder (modulo): seconds * milliseconds
if (secondsInMillis < 30000) {
time -= secondsInMillis; //round down
} else {
time += (60000 - secondsInMillis); // round up
}
不要重新發明輪子。 使用java.time.Instant
表示即時時間:
Instant i = Instant.ofEpochMilli(time);
i = i.plusSeconds(30).truncatedTo(ChronoUnit.MINUTES);
Instant
不提供舍入,僅提供截斷。 但是,添加30秒然后截斷將為您提供所需的內容。 如果需要毫秒數,這很簡單:
time = i.toEpochMilli();
System.out.println(time);
用您問題中的數字打印
12120000
(這等於CET中的1970-01-01T03:22:00Z或1970-01-01T04:22 + 01:00 [Europe / Paris]的04:22:16 CET
,或您的04:22:16 CET
的預期取整04:22:16 CET
。)
PS:我非常確信, Time4J之類的庫將提供舍入功能,因此您無需添加和截斷技巧。 不幸的是,我沒有經驗為您提供詳細信息。
使用Calendar.set重設秒和毫秒
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.add(Calendar.MINUTES, calendar.get(Calendar.SECOND) >= 30 ? 1 : 0)
currentDate = cal.getTimeInMillis();
將給定的日歷字段設置為給定的值。 不管寬大處理模式如何,此方法都不會解釋該值。
您應該在Date對象上執行此操作。 由於各種困難(包括一個月的長度(28、29、30或31)),在時間周期內沒有簡單的方法可以計算出來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.