Java中的日期差异每天23小时

Java中的日期差异每天23小时,java,date,Java,Date,我必须计算到日期之间的差异,我找到了一种方法,但我有一个奇怪的结果,我是否遗漏了什么 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("2

我必须计算到日期之间的差异,我找到了一种方法,但我有一个奇怪的结果,我是否遗漏了什么

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图书馆,当我用这种方法计算差异时,我有一个问题:

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不被考虑)

考虑到DST(我已经尝试了不同的方法,但我没有得到它),我应该使用什么课程/微积分来获得23小时的成绩


感谢您的帮助。

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

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


(正如在另一个答案中所指出的,通常是一个更好的API—但您仍然需要知道如何正确使用它,并且在尝试计算实际经过的时间时,您仍然可以在此处看到相同的结果。)

必须按照下面的说明放置库文件

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();
    } 

@法比安巴尼:根据我的经验,使用第二天的00:00更为常见。这是ISO-8601明确允许的——以我的经验来看,这是不寻常的。是的,谢谢,我没有想到!我的默认时区是“欧洲/巴黎”。我必须测量不同时区的日期之间小时数的差异,但我已经开始编写一段简单的代码,从基本开始。@AlexWien 24:00对于ISO-8601完全有效,正如Jon提到的。至少在德国,这是用来表达你想要某一天的结束,而不是下一天的开始。这在很多情况下会造成语义上的差异。@MukulGoel:No,23:59仍然是一天结束前的一分钟,如果你谈论的是瞬间(通常是这样)。24:00和第二天00:00之间的等价关系很好。@MukulGoel:问题是你一直忽略了“排他性上限”部分。当它被用来将一天的结束标记为一个排他性的上限时,这没关系——因为它不包含在一天之内。没有即时缺失等。在过去三年中,我一直在使用日期/时间API,对此我非常满意,我不希望出现“一天中的最后一刻,包含”,因为您几乎不应该使用包含上限。@Quoi IST根本不使用DST。所以你不会看到DST造成的影响,谢谢我明白了,也找到了下面的答案:)请把你的第二个问题作为第二个问题来问。询问乔达的时间需要一个完全不同(且冗长)的答案。每个帖子一个问题,谢谢!