Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算从毫秒到时间的时间_Java_Time_Logic - Fatal编程技术网

Java 计算从毫秒到时间的时间

Java 计算从毫秒到时间的时间,java,time,logic,Java,Time,Logic,下面的代码用于设置毫秒的格式。计算结果相差甚远。我需要一些帮助。下面是我的代码的输出以及Date类的毫秒数 public static void main(String[] args) { System.out.println("Wrong Time: " + getTime(999999999 * 599)); } //Being called into this method is milliseconds = 598999999401 public static String

下面的代码用于设置毫秒的格式。计算结果相差甚远。我需要一些帮助。下面是我的代码的输出以及Date类的毫秒数

public static void main(String[] args) {
    System.out.println("Wrong Time: " + getTime(999999999 * 599));

}

//Being called into this method is milliseconds = 598999999401
public static String getTime(long miliseconds) {
    int years = (int) ((miliseconds / (1000*60*60*24*7*52*12)));
    int months = (int) (miliseconds / (1000*60*60*24*7*52) % 12);
    int weeks = (int) ((miliseconds / (1000*60*60*24*7)) % 52);
    int days = (int) ((miliseconds / (1000*60*60*24)) % 7);
    int hours = (int) ((miliseconds / (1000*60*60)) % 24);
    int minutes = (int) ((miliseconds / (1000*60)) % 60);
    int seconds = (int) (miliseconds / 1000) % 60;
    Date date = new Date(598999999401L);//This gets the real time
    System.out.println("Right Time: " + date.getYear() + " years " + (int)(date.getMonth() % 12) + " months " + (int)(date.getDay() % 52) + " weeks "
            + (int)(date.getDay() % 7) + " days " + (int)(date.getHours() % 24) + " hours " + (int)(date.getMinutes() % 60) + " minutes " +
            + (int)(date.getSeconds() % 60) + " seconds");
    return (years <= 0 ? "" : years + " year" + (years != 1 ? "s" : "")) +
            (months <= 0 ? "" : " " + months + " month" + (months != 1 ? "s" : "")) +
            (weeks <= 0 ? "" : " " + weeks + " week" + (weeks != 1 ? "s" : "")) +
            (days <= 0 ? "" : " " + days + " day" + (days != 1 ? "s" : "")) +
            (hours <= 0 ? "" : " " + hours + " hour" + (hours != 1 ? "s" : "")) + 
            (minutes <= 0 ? "" : " " + minutes + " minute" + (minutes != 1 ? "s" : "")) +
            (seconds <= 0 ? "" : " " + seconds + " second" + (seconds != 1 ? "s" : ""));
}
输出错误(我的方法)

更新1(新计算)(仍有逻辑错误):


一个问题是int溢出,因为您的主方法使用int文本,而不是long。尝试:

System.out.println("Wrong Time: " + getTime(999999999L * 599L));
另外,不要使用幻数。使用有意义的常量,使代码能够自我注释:

private static final int MILI_PER_SEC = 1000;
private static final int SEC_PER_MIN = 60;
private static final int MIN_PER_HR = 60;
private static final int HR_PER_DAY = 24;
private static final int DAYS_PER_YR = 365;
然后呢,

int years = (int) (miliseconds / (MILI_PER_SEC * SEC_PER_MIN * MIN_PER_HR * 
                  HR_PER_DAY * DAYS_PER_YR));

而且,你的计算都错了。你根本不应该在年度计算中使用周。使用常量,让它们有意义。你怎么知道“正确”的结果实际上是正确的?您使用的是不推荐使用的代码,Date并不像您认为的那样使用毫秒。它根据。

两个问题计算相对于1970年1月1日00:00:00 GMT的日期

您的代码似乎反映了一种信念,即一个月有52周。这是有故障的两条线路

int years = (int) ((miliseconds / (1000*60*60*24*7*52*12)));
int months = (int) (miliseconds / (1000*60*60*24*7*52) % 12);

另外,您正在使用
int
,您应该在其中使用
long
。最大的
int
毫秒数不到25天,所以你永远不能用
int

做日期/时间算术,同样的效果,但计算表明现在只有2周。我还将其直接更改为5989999401L在这段代码中,您计算的时间
错误
?正在调用getTime(长毫秒)。所有变量都在计算的位置。您知道这项工作存在日期时间库吗?在Joda时代,看看类和PeriodFormatter类。
private static final int MILI_PER_SEC = 1000;
private static final int SEC_PER_MIN = 60;
private static final int MIN_PER_HR = 60;
private static final int HR_PER_DAY = 24;
private static final int DAYS_PER_YR = 365;
int years = (int) (miliseconds / (MILI_PER_SEC * SEC_PER_MIN * MIN_PER_HR * 
                  HR_PER_DAY * DAYS_PER_YR));
int years = (int) ((miliseconds / (1000*60*60*24*7*52*12)));
int months = (int) (miliseconds / (1000*60*60*24*7*52) % 12);