簡體   English   中英

Java將秒轉換為年日小時秒

[英]Java converting seconds to year day hours minute seconds

關於Java中的大數字我有一個問題。 我目前正在嘗試將由大量秒組成的雙精度轉換為年,日,小時,分鍾和剩余的秒數。 我的代碼如下:`

import java.util.Scanner;


 public class timer {


 public static void main(String[] args){



     double sum = 1.1078087563769418E16;

    double sec=0;
    double min=0;
    double hou=0;
    double da=0;
    double yea=0;


    yea=sum/31536000;
    int year = (int) yea;
    sum=sum-year*31536000;

    da=sum/86400;
    int day = (int) da;
    sum=sum-day*86400;

    hou=sum/3600;
    int hour = (int) hou;
    sum=sum-hour*3600;

    min=sum/60;
    int minute = (int) min;
    sum=sum-minute*60;

    sec=sum;
    int second = (int) sec;
    sum=sum-second*60;

    System.out.println(year+" "+day+" "+hour+" "+minute+" "+second);            
}
}

`

當雙“和”與它一樣大時,輸出變得奇怪。 例如,雙“天”變得大於365,這應該是不可能的。

有解決方案嗎

計算sum=sum-year*31536000;溢出sum=sum-year*31536000;

year31536000都是整數,它們的乘積是〜1E16,大於java的最大整數。 請改用sum = sum-year*31536000.0

作為演示,在計算year后添加此代碼:

System.out.println(year * 31536000.0); //  1.1078087556672E16
System.out.println(year * 31536000);   //  1100687872

您面臨着一個大多數開發人員應該了解的非常常見的問題:整數溢出。

你的year變量是一個int,second-> year轉換的常量是常量int,所以int * int是... int。 除非你的年份大於約68,否則結果不適合int。 因此 - 溢出和愚蠢的結果。

您有幾種選擇:

  1. 用longs做你的時間戳算術。 真的,這無論如何都是行業標准。
  2. 如果你堅持超過幾微秒的精度(如果你只關心上個世紀的納米) - BigDecimal或BigInteger是你的朋友。
  3. 使用TimeUnit從類concurrent包。 它沒有幾年,但確實有幾天並且很好地進行轉換(盡管JodaTime會更好)

你可以使用java.math。 BigDecimal類,如果你需要高精度地表示數字。

如果需要大整數,可以使用java.math。 BigInteger

        First use long not double then try this logic

            long min = sum / (60) % 60;
            long hou = sum / (60 * 60 )% 24;
            long da = sum/(60*60*24)%30;
            long yea = sum/(60*60*24*30)%365;

如果該數字超出了long的限制,那么使用BigInteger但是這個計算將不起作用。

暫無
暫無

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

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