代码之家  ›  专栏  ›  技术社区  ›  Omar Kooheji

为什么这段代码给了我一个未来3.9万年的日期?

  •  1
  • Omar Kooheji  · 技术社区  · 15 年前

    我写了一个方法,返回字符串格式日期的毫秒值,出于某种原因,它给出了未来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;
        }
    

    好的,我认为问题是它让ms通过了Java epoc,我正在对照unix时代对其进行评估。。。

    4 回复  |  直到 15 年前
        1
  •  17
  •   Paul Tomblin    15 年前

    我猜您将getTime()返回的值解释为Unix时间值。它不是——它是Java时代过去的毫秒,而不是Unix时代过去的秒。

        2
  •  4
  •   skaffman    15 年前

    我觉得很好。解析toString到“2009年7月7日星期二10:51:01英国夏令时”(我在这里的英国时区)的日期对象,但这应该没有太大区别。1246960261000的毫安值是正确的,为什么你认为它的计算结果是遥远的未来?你是怎么计算的?

        3
  •  1
  •   Alan Moore    15 年前

    该值是正确的,事实上:

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

    39.54176373033992年,考虑到0是1970年,这是正确的。

        4
  •  1
  •   akf    15 年前

    在Java6中运行您的代码,我得到了1246978261000,这证明是正确的。

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

    2009年7月7日星期二10:51:01美国东部时间

    编辑:

    要确认其他人的建议,即您正在查看秒(不是毫秒),请执行以下操作:

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

    星期一美国东部时间3月2日13:16:40 41485