Java:最简单的方法来减去日期tl;博士解析当前日期减去日期

2022-09-02 11:28:49

我创建了一个类,其中包含两个需要是日期的字段,以及.我一直在研究Java中最好的方法,以一种允许轻松减去日期的格式设置日期,以及“弥补”日期的能力,例如将来。start_datedate_passedYYYY MM DD

我希望它做什么的例子...

library.circulate_book("Chemistry", **start date here**) //actual date or random date
library.pass_book("Chemistry", **Date Passed here**) //random date such as 5 days after start date
int days_had = Date_Passed - start_date

到目前为止,我已经找到了很多使用日历和日期类设置日期格式的方法,但考虑到大多数日期最终都是字符串,我还没有找到一种看起来可行的方法。任何建议/小例子都非常感谢!此外,任何指向示例的链接都将很棒!


答案 1

tl;博士

通过添加/减去天数从一个日期移动到另一个日期。

LocalDate.now(
    ZoneId.of( "Pacific/Auckland" ) 
)
.minusDays( 5 )

计算两个日期之间经过的天数、月数和年数。

ChronoUnit.DAYS.between( start , stop )

解析

首先,必须将字符串输入解析为日期时间对象。然后,您可以使用这些对象预制业务逻辑

不要再将日期时间值视为字符串,这会让你发疯。我们在代码中使用日期时间对象;我们使用该日期时间对象的字符串表示形式与用户或其他应用程序交换数据。

在 Java 8 及更高版本中,请使用 java.time 框架。请参阅教程

您只需要一个日期,而不需要一天中的时间,因此我们可以使用 LocalDate 类。

这种时髦的双冒号语法是一种方法参考,一种说其他代码应该调用什么方法的方法。

String input = "2015 01 02";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyyy MM dd" );
LocalDate localDate = formatter.parse ( input , LocalDate :: from );

当前日期

确定今天的日期需要一个时区。在任何给定的时刻,日期在全球范围内因区域而异。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate todayTunis = LocalDate.now( z ) ;

如果需要 JVM 的当前默认时区,请调用 。ZoneId.systemDefault

减去日期

这个问题在 StackOveflow.com 之前已经解决过很多次了。例如,如何使用Java日历从日期中减去X天?有关详细信息,请参阅其他答案,例如我的这个答案和我的这个答案以获取更多详细信息。提示:“已用”是一个关键搜索词。

使用 ChronoUnit.DAYS 枚举计算已用天数。

LocalDate weekLater = localDate.plusDays ( 7 );
long daysElapsed = java.time.temporal.ChronoUnit.DAYS.between( todayTunis , weekLater ) ;

转储到控制台。

System.out.println ( "localDate: " + localDate + " to " + weekLater + " in days: " + daysElapsed );

本地日期: 2015-01-02 至 2015-01-09 在天: 7


答案 2

在Java-8中做到这一点的最佳方法不是Basil Bourque的有缺陷的答案,而是这种方法:

String startDate = "2016 01 02";
String passedDate = "2016 02 29";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
LocalDate date1 = LocalDate.parse(startDate, formatter);
LocalDate date2 = LocalDate.parse(passedDate, formatter);

long elapsedDays = ChronoUnit.DAYS.between(date1, date2);
System.out.println(elapsedDays); // 58 (correct)

建议的使用是危险的,并且一旦经过的持续时间超过一个月,通常是错误的。整个是 P1M27D,因此此代码实际上只查询部分已用天数(还有一个已用月份):java.time.Period.getDays()Period

System.out.println(Period.between(date1, date2).getDays()); // 27 (WRONG!!!)

使用java.util.DateGregorianCalendar等类的令人满意的解决方案很难找到。您可以使用Tacktheritrix的答案,但必须注意这样一个事实,即由于子日部分而计算的已用天数可能会有所不同,并且由于忽略节光开关(在世界许多地方,时钟跳动一小时)而不可靠。java.util.Date

附注:至少有8个外部库也为您的问题提供了很好的答案。但我认为,你的简单用例并不能证明嵌入额外的库是合理的,除非你还没有使用Java-8。任何替代解决方案如何计算两个日期之间的经过天数都不会比Java-8更容易 - 只是相似。既然你接受了Basil Bourque的Java-8相关答案,我假设你确实在Java-8上,所以我省略了如何解决其他库问题的答案。