2011-01-07 62 views
1

我最近面临着从Java中的两个日期计算天数的问题(我没有使用joda,恐怕)。在网上搜索显示,这个问题的大部分答案都是为了获得这两天的毫秒数,并将其转换为几天,这让我感到震惊。然而,少数人表现出不同的方法:使用一个临时变量来计算需要多少次,在第一天添加1天才能到达第二天。这将转换转换为最擅长的代码:库。为什么在Java中使用毫秒进行日期操作?

为什么这么多人主张第一?

在另一个项目中,我以前遇到过许多细微日期计算问题,涉及时区,夏令时和甚至闰年,使用秒进行日期比较和计算。当全部比较和计算代码被重新使用语言库时,所有这些都消失了。 (虽然这是用PHP编写的,但是这些库的结构与Java完全不同)。所以我可以理解地不愿意在Java的世界中使用这种“常见智慧”来比较日期。

回答

2

它可能很容易,而且高效,但绝对不是你想投入生产的东西。

作为一个例子,在保险行业中,这种计算模式可能导致一天中的误差,在正确的边界上,可能导致一年的误差,导致不正确的年龄计算并且可能是拒绝保险索赔:)(查看here QED)

我遇到了一个灾难性的情况,在英国使用这个毫秒的操作(他们有DST),这是一个真正的混乱,以解决。

因此,要回答你的问题:

那么为什么很多人主张先?

因为他们知道后果,它不适用于他们或他们是幸福没有意识,可能不会长到足以看到这种影响。

0

因为它简单而高效。

没有引用一个单一的Javadoc页,我知道,我需要处理日期在您所描述的方式的API:java.util.Date#getTime(),以及基本的算术 - 就是这样

是的,它是低级的,但Java的标准日期库是一个灾难。

+1

我原来说过很多相同的事情。问题是,我认为格里高利的不连续性,甚至是闰秒(第一个完全没有关系,第二个只关系到相当专业的软件),但是错过了更紧迫的担心,即某些日子有23个小时,有些日子有25.(夏令时问题。)基本上,它只是杀死它。感谢@jambjo指出这一点。 – 2011-01-07 21:24:55

+0

@ T.J .:你的观点是完全有效的。不过,我认为我以不同的方式解释了这个问题。我把这个问题看成是问为什么有这么多的建议来这样做。这种方法绝不会比乔达时代更好,除了极其简单。此外,它是** jarnbjo **(谢谢,结绳!):) – 2011-01-07 22:23:01

0

我建议尽可能将您的休假时区转换为前端GUI。我建议你将所有的服务器以GMT(或其他固定时间)运行,这将使得你的计算更简单,因为System.currentTimeMillis()是在GMT时间。例如拿到一天GMT只是

long day = System.currentTimeMillis()/86400000; 
long anotherDay = anotherMillis/86400000; 
long intervalInDays = day - anotherDay; 

由于@Ryan状态,你需要了解直接使用日期/时间的后果。

使用更高级别的API可以使您的代码更清晰,使其更容易维护他人,减少出错(现在或未来)的可能性。

使用long值为太多速度更快,但对于90%的应用程序,您不需要它,而且最好使用高级库。 (仍然会使所有服务器保持一致的时区,并让GUI决定如何显示它)

您必须权衡一个错误的代价与可能不够快的代价。