Java SimpleDateFormat格式日期介于发布日期之间

Java SimpleDateFormat格式日期介于发布日期之间,java,Java,我需要计算两个日期之间的时间,一个日期是现在。我使用SimpleDateFormat格式化日期 public String getPeriod(Date endDate) { String format; Date now = new Date(); long period = endDate.getTime() - now.getTime(); if (now.after(endDate)) { return "passed"; }

我需要计算两个日期之间的时间,一个日期是现在。我使用
SimpleDateFormat
格式化日期

public String getPeriod(Date endDate) {
    String format;
    Date now = new Date();
    long period  = endDate.getTime() - now.getTime();

    if (now.after(endDate)) {
        return "passed";
    } else {
        if (period < 1000 * 60 * 60)
            format = "m'M' s'S'";
        else if (period  < 1000 * 60 * 60 * 24)
            format = "k'H' m'M'";
        else
            format = "'Too much'";

        SimpleDateFormat formatter = new SimpleDateFormat(format);
        return formatter.format(new Date(period)) + " / for testing - " + period / 3600000 + " hours";
    }
}

正如您所看到的,我的测试计算和格式的方法结果不匹配。我做错了什么?

差异是由时区造成的。例如,在我的例子中,给定一小时内的时间作为参数,我得到3H作为输出,因为日期是1970年1月1日星期四03:00:00 EET。注意EET(我来自东欧)

如果您通知java使用GMT时间,您的代码将正常工作,正如新日期(long)描述中所述:

分配日期对象并将其初始化以表示指定的日期 自标准基准时间(称为“基准时间”)起的毫秒数 “纪元”,即1970年1月1日00:00:00 GMT

另外,请记住,日期并不能给出完美的结果。使用编程确定的日期精确到1h appart(无毫秒/分钟差异),日期计算得出的偏移量为59分钟、59秒和999毫秒。如果需要更精确的值,则应使用纳秒

然而,其他评论者是对的。您不应该以这种方式使用Java日期/日历,因为它是一个bug工厂(这只是一个极端情况)。您应该查看其他库(例如yoda time),或者如果您只需要像这样的简单计算,请自己进行


希望能有所帮助。

java.util.Date类有点乱,以后我会寻找替代方案。java.util.Calandar类也是一团乱麻,我会研究Joda Time:)
SimpleDateFormat
用于格式化
日期
——一个时间点。两次之间的差异不是时间点。你不应该用它。
1 H 36 M / for testing - 22 hours