Java将秒转换为年日时分秒

标签 java int double biginteger

我对 Java 中非常大的数字有疑问。 我目前正在尝试将由大量秒组成的 double 转换为年、天、小时、分钟和剩下的秒数。 我的代码如下所示:`

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,这应该是不可能的。

有什么解决办法吗?

最佳答案

您正面临一个大多数开发人员都应该知道的非常普遍的问题:整数溢出。

你的year变量是一个int,second->year转换的常量是constant int,所以int*int是……int。除非您的年份大于大约 68,否则结果不能放入 int 中。因此 - 溢出和愚蠢的结果。

您有几个可用的选项:

  1. 用长整数计算时间戳。真的,这无论如何都是行业标准。
  2. 如果您坚持超过微秒的精度(如果您只关心上个世纪,则为纳精度)- BigDecimal 或 BigInteger 是您的 friend 。
  3. 使用 concurrent 包中的 TimeUnit 类。它没有年限,但有天数并且可以很好地进行转换(不过 JodaTime 会更好)

关于Java将秒转换为年日时分秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24065958/

相关文章:

Java BufferedImage 从 Canvas 返回黑色图像

javascript - jQuery:int值分割为数组

c++ - 将 double 的位模式显示为十六进制?

java - 文件到字节数组的转换实际上是如何工作的?

java - Android 中的 Groovy 扩展模块?

java - 使用 Java 加速对 MySQL 的查询调用

iphone - int 和++new 每次都加 2

c++ - 为什么在 C++ 中没有指定复数?

java - 不进行任何舍入,最多保留 3 位小数

Java Nice 格式 double