【问题标题】:Subtracting milliseconds doesn't give expected result减去毫秒不会产生预期的结果
【发布时间】:2017-06-29 10:01:09
【问题描述】:
Date day1 = set_datetime(2017, Calendar.JUNE, 28, 8, 00, 0); 

Date day2 = set_datetime(2017, Calendar.JUNE, 28, 10, 00, 0);

def set_datetime(int year, int month, int day, int hour, int minute, int second) {
        Calendar cal = Calendar.getInstance();
        cal.set(year, month, day, hour, minute, second);
        Date cal_date = cal.getTime();
        return cal_date
    }

println "\t\t (day2.getTime() - day1.getTime()) = " + (day2.getTime() - day1.getTime())

(day2.getTime() - day1.getTime()) = 7199996

这里似乎有些问题,因为当我将毫秒转换为小时时,7199996 并不完全是 2 小时 (7200000)。事实上,它少了 4 毫秒。为什么不是 7200000 毫秒?

【问题讨论】:

    标签: java date datetime grails groovy


    【解决方案1】:

    您没有清除毫秒字段。

    添加

    cal.clear();
    

    cal.set(...); 行之前,或添加

    cal.set(Calendar.MILLISECONDS, 0);
    

    更一般地说,不要使用 java.util.Calendar 和 java.util.Date:它们是陈旧的、设计不佳的类,充满了众所周知的错误。

    使用 Java 8 中引入的 java.time 包中的类;或来自 threetenbp 或早期 Java 版本的 JodaTime 的类。

    【讨论】:

    • 谢谢。但是我必须使用java 6,我们的低端服务器
    • "或较早版本上来自threetenbp或JodaTime的类。"
    【解决方案2】:

    为了支持并作为对已接受答案的适度补充,下面是 ThreeTen-Backport 版本,它将在 Java 6 上运行。

    LocalDateTime dateTime1 = LocalDateTime.of(2017, Month.JUNE, 28, 8, 0);
    LocalDateTime dateTime2 = LocalDateTime.of(2017, Month.JUNE, 28, 10, 0);
    System.out.println("\t\t (dateTime2 - dateTime1) = " 
                + Duration.between(dateTime1, dateTime2).toMillis());
    

    打印出来:

    (dateTime2 - dateTime1) = 7200000

    抱歉,我没有运行 Groovy/Grails 环境,所以我只给了你 Java 代码,并且必须相信你会翻译。

    您的问题只是关于Calendar 等过时类的又一个问题,它仅显示了您从这些类中获得意外结果的难易程度以及在此情况下您经常留下的线索有多么少的一个示例发生。在您的情况下,为 Java 6 获取 ThreeTen-Backport 当然值得考虑。另外,上面的代码也更短,在我看来更清晰更自然。

    【讨论】:

    • 谢谢,@Userthatisnotauser,为了改进。
    猜你喜欢
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    相关资源
    最近更新 更多