繁体   English   中英

Java,如何在考虑DST的同时减去Date对象

[英]Java, How to subtract Date objects whilst considering DST

我有一段代码用于计算两个Date对象之间的天数,并且在大多数情况下,它工作正常。 但是,如果两个对象之间的日期范围包括3月底,则结果总是比应有的少1。 例如2014年3月31日-2014年3月29日= 1,则应为2。

我知道这是由于DST导致3月有24天的30天和23小时的1天,这是导致该值减少1的原因。

但是,我不确定占缺席时间的最佳方法。

   // This was what I have initially
    int numDays = (int) ((dateTo.getTime() - dateFrom.getTime()) / (1000 * 60 * 60 * 24));

   // I have tried rounding, since it should have 23 hours left over, but it didn't actually work.
    int numDays = (Math.round(dateTo.getTime() - dateFrom.getTime()) / (1000 * 60 * 60 * 24));

任何帮助/指针将不胜感激。

我现在必须使用Java 7,但不幸的是我无法使用Jodatime。

您的第二个示例非常接近。 但是,您对Math.round()括号仅包含减法,因此,由于该整数已经是整数(实际上是一个long的整数),因此什么也没有发生,然后除法。 第二个代码位的另一个问题是您正在执行整数除法,该运算总是将小数点后的部分截断。 尝试这个:

long numDays2 = Math.round((dateTo.getTime() - dateFrom.getTime()) / (1000.0 * 60 * 60 * 24));

(如前所述,我更改了Math.round()括号,并通过将除数设为double来进行浮点除法。)

但是,如评论所示,这是一个hack。 特别是,它将告诉您3月5日上午6点到3月6日下午8点之间有两天。这可能并不是您真正想要的。 试穿以获取尺寸:

    SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
    Calendar cal = Calendar.getInstance();
    cal.setTime(fmt.parse("2014-03-29"));
    long start = cal.getTimeInMillis();
    start += cal.getTimeZone().getOffset(start);
    cal.setTime(fmt.parse("2014-03-31"));
    long end = cal.getTimeInMillis();
    end += cal.getTimeZone().getOffset(end);

    System.out.println((end - start)/86400000.0);

丑吗? 是。 奇怪吗 是。 它行得通吗? 是的,我想是这样)。 请注意,因此,我要提供double的费用; 您可以将任何所需的舍入应用于此结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM