簡體   English   中英

舍入日期長值

[英]Round date long value

在我的Java項目中,我使用了long日期,例如,它是12136219並通過創建Date對象,如下所示:

long time = 12136219;
Date date = new Date(time);

並將日期表示為Thu Jan 01 04:22:16 CET 1970Thu 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.

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