5

我必须计算日期之间的差异,我找到了一种方法,但我得到了这个奇怪的结果,我错过了什么吗?

public static void main(String[] args) throws ParseException {
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    long result = format.parse("2012-03-25 24:00").getTime() - format.parse("2012-03-25 00:00").getTime();
    System.out.println("Difference in hours: " + result/(1000*60*60));
    result = format.parse("2012-03-26 24:00").getTime() - format.parse("2012-03-26 00:00").getTime();
    System.out.println("Difference in hours: " + result/(1000*60*60));
}

结果如下: 小时差异:23 小时差异:24

感谢您的建议,现在我正在使用 Joda libray,当我以这种方式计算差异时,我有这个问题:

DateTime  begin = new DateTime("2012-03-25T00:00+01:00");
DateTime  end = new DateTime("2012-03-26T00:00+01:00");
Hours m = Hours.hoursBetween(begin, end);

如果我用这种方式来计算我得到 24 小时的小时数(因为我假设不考虑 DST)

考虑到夏令时(我已经尝试过不同的方法但我不明白),我应该使用什么课程/微积分来获得 23 小时的 Period 课程?

感谢所有的帮助...

4

2 回答 2

11

您可能碰巧选择了夏令时在该时区发生变化的日期,因此这一天实际上可能只有 23 小时。(2012 年 3 月 25 日当然是欧洲的 DST 更改日期,例如Europe/London。不过我们不知道您的默认时区是什么。)

如果您将日期格式设置为使用 UTC,您应该不会看到这种效果。(请注意,在字符串表示中使用 24:00 有点奇怪。)目前尚不清楚您的数据表示什么,或者您要测量什么。如果您想计算这些当地时间之间实际经过了多少时间,您应该计算出您的数据真正应该在哪个时区。

(如另一个答案中所述,Joda Time通常是一个更好的 API - 但您仍然需要知道如何正确使用它,并且在尝试计算实际经过的时间时,您仍然会在这里看到相同的结果.)

于 2012-11-23T10:36:08.590 回答
-1

必须像下面解释的那样放置库文件。

import java.util.Date;  

String dateStart = dateChooserCombo1.getText();
    String dateStop =dateChooserCombo2.getText();

    //HH converts hour in 24 hours format (0-23), day calculation
    SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");

    Date d1 = null;
    Date d2 = null;

    try {
        d1 =  format.parse(dateStart);
        d2 =  format.parse(dateStop);

        //in milliseconds
        long diff = d2.getTime() - d1.getTime();

        long diffSeconds = diff / 1000 % 60;
        long diffMinutes = diff / (60 * 1000) % 60;
        long diffHours = diff / (60 * 60 * 1000) % 24;
        long diffDays = diff / (24 * 60 * 60 * 1000);

        //System.out.print(diffDays + " days, ");
        jTextField3.setText(""+diffDays);

    } catch (Exception e) {
        e.printStackTrace();
    } 
于 2017-02-16T10:17:07.297 回答