我觉得Java(或java.util库)没有内置函数来计算日期差异很有趣。我想从另一个日期中减去一个日期以获得它们之间的经过时间。做这个的最好方式是什么?
我知道简单的方法是以毫秒为单位取时间差,然后将其转换为天。但是,我想知道这是否适用于所有情况(夏令时等)。
答案 0 :(得分:8)
如果你看一下开源代码,那么Java不会错过太多:试试Joda-Time。
答案 1 :(得分:6)
我知道简单的方法是采取 以毫秒为单位的时间差 然后将其转换为天。 但是,我想知道是否这样 适用于所有情况(日光 储蓄等。)。
如果您的时间来自UTC日期,或者它们只是在同一系统上测量的两次System.getCurrentTimeMillis()调用之间的差异,那么您将获得有效的毫秒数作为差异,与任何时区问题无关。 (这就是为什么一切都应该使用UTC作为存储格式 - 从UTC->本地时间开始要容易得多;如果你试图转向其他方式,那么你需要将当地时区与当地时间一起存储 - - 或试图推断它,gack!)
至于把它变成几天,你应该能够除以86400000 ...但需要注意的是每隔一年左右偶尔会有leap second。
答案 2 :(得分:4)
在Java 8中使用Joda-Time或新的java.time包。
两个框架都使用半开放式方法,其中开头是包含,而结尾是独占。有时标记为[)
。这通常是定义时间跨度的最佳方法。
Java 8及更高版本中内置的java.time框架有一个Period
类,用于表示一段时间,几个月和几天的时间跨度。但这个课程仅限于整天,不代表小时,分钟和秒。
请注意,我们指定时区,这对于确定日期至关重要。例如,Paris中的新日期早于Montréal。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate now = LocalDate.now( zoneId );
LocalDate then = LocalDate.of( 2001, 1, 1 );
Period period = Period.between( then, now );
然后:2001-01-01。现在:2015-09-07。时间:P14Y8M6D。天:5362
整天都是Daylight Saving Time (DST)无关紧要。
如果您想要计算总天数,请使用包含一些计算方法的ChronoUnit
枚举。请注意,计算结果很长。
long days = ChronoUnit.DAYS.between( then, now ); // "5362" seen above.
I have asked关于在java.time中完成一段时间,包括小时,分钟,秒。从Java 8开始不可行。was suggested使用捆绑库Meno Hochschild的令人惊讶的解决方法:使用Duration
中的javax.xml.datatype package类。
以下是Joda-Time 2.3中的一些示例代码。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime start = new DateTime( 2014, 1, 2, 3, 4, 5, timeZone );
DateTime stop = new DateTime( 2014, 5, 2, 3, 4, 5, timeZone );
Period period = new Period( start, stop );
调用toString
会以ISO 8601标准PnYnMnDTnHnMnS
定义的格式为您提供字符串表示形式。
答案 3 :(得分:2)
使用date4j库:
int numDaysBetween = oneDate.numDaysFrom(anotherDate);
答案 4 :(得分:1)
有一种简单的方法可以实现它。我们可以使用带有循环的Calendar.add方法。 例如,如下所示,
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date beginDate = dateFormat.parse("2013-11-29");
Date endDate = dateFormat.parse("2013-12-4");
Calendar beginCalendar = Calendar.getInstance();
beginCalendar.setTime(beginDate);
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);
beginDate和endDate之间的减去天数,以及下面的代码,
int minusDays = 0;
while (true) {
minusDays++;
// Day increasing by 1
beginCalendar.add(Calendar.DAY_OF_MONTH, 1);
if (dateFormat.format(beginCalendar.getTime()).
equals(dateFormat.format(endCalendar).getTime())) {
break;
}
}
System.out.println("The substractation between two days is " + (minusDays + 1));
玩得开心! @。@
答案 5 :(得分:0)
Java的日期实现很差。如果您发现Joda-Time过于复杂,请尝试我对开源的贡献: http://calendardate.sourceforge.net/javadoc/index.html
答案 6 :(得分:0)
我不同意Java没有计算日期差异的机制的说法。
Java专为全球使用而设计。它的设计使得没有日期概念,只有“以毫秒为单位的时间”的概念。在特定公约下对特定地点的时间和日期这样的普遍时间的任何解释仅仅是投影或观点。
日历类用于将此类绝对时间转换为日期。如果确实需要,您还可以添加或减去日期组件。在两次之间提供组件术语差异的唯一方法是生成日历和特定日历。因此,您可以争辩说标准库不包含足够聪明的格里高利历,我同意它会留下一些不足之处。
话虽如此,有很多这种功能的实现,我看到其他人提供了一些例子。