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

标签 java date datetime

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

据我了解,这是因为由于夏令时,3 月有 30 天 24 小时制和 1 天 23 小时制,导致该值减少 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 使其成为浮点除法。)

不过,正如评论所指出的,这是一个黑客行为。特别是,它会告诉您 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 作为结果;您可以对此结果应用任何您想要的舍入。

关于Java,如何在考虑 DST 的同时减去日期对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30761682/

相关文章:

java - 将单词添加到 HashMap,键为单词出现的次数

java - 在java中分别打印一个字符串中给出的字母和数字

c - 通过 USB 获取系统日期/时间

sql - 使用 SQL 对共享共同状态的连续项目进行分组(包括虚拟数据)

c# - 如何在 C# 中指定某个 DateTime 值是否在同一天?

Java Swing 自定义文本 JEditorPane

java - 如何避免一对多单向关联中的插入和更新查询

r - 从 POSIXct 对象中减去一年

c++ - 如何将 fromString() 与 currentDate() 一起使用

java - 无法再次将日期设置为空