[英]Best practice in `Date` exchange between Java and JavaScript, considering the DST
[英]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.