为什么这段代码会给我一个39k年后的约会?

时间:2009-07-08 16:03:06

标签: java datetime

我写了一个返回字符串格式化日期的毫秒值的方法,由于某种原因,它给了我将来39000年的日期。任何想法为什么?

private long getTimeInMs(String currentStartTimeString) {
        //String newDateString = currentStartTimeString.substring(6,10)+"-"+currentStartTimeString.substring(3, 5)+"-"+currentStartTimeString.substring(0, 2)+ "T" + currentStartTimeString.substring(11);
        String newDateString = currentStartTimeString.substring(0,19);
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        long timeInMs;
        try {
            timeInMs = df.parse(newDateString).getTime();
        } catch (ParseException e) {
            log.error("Failed to parse current Start Time",e);
            return 0;
        }
        return timeInMs;
    }

如果我输入日期字符串“2009-07-07 10:51:01.15”,则返回1246960261000,实际上是星期三06月06日41484 11:16:40 GMT + 0100(GMT日光时间)

好吧我认为问题在于它正在给ms过去Java epoc并且我正在对unix时代进行评估......

4 个答案:

答案 0 :(得分:17)

我猜你是从getTime()解释返回的值,好像它是一个Unix time_t值。它不是 - 它超过了Java时代的毫秒,而不是超过Unix时代的秒数。

答案 1 :(得分:4)

对我来说很好看。从解析toString到“Tue Jul 07 10:51:01 BST 2009”(我在英国时区这里)出来的Date对象,但这应该没什么大不同)。 millis值1246960261000是正确的,为什么你认为评估到遥远的未来?你是怎么计算的?

答案 2 :(得分:1)

在Java 6中运行代码,我得到1246978261000,结果证明是正确的。

System.out.println(new Date(timeInMs));

返回

  

Tue Jul 07 10:51:01 EDT 2009

修改

确认其他人建议您查看秒数(而不是毫秒数):

System.out.println(new Date(timeInMs*1000));

产量

  

Mon Mar 02 13:16:40 EST 41485

答案 3 :(得分:1)

值正确,实际上是:

 (((((1246989061000 / 1000) / 60)/60)/24)/365)

给出

鉴于0是1970,

39.54176373033992年是正确的。