Java:减去日期的最简单方法

新手上路,请多包涵

我创建了一个类,其中包含两个需要日期的字段, start_datedate_passed 。我一直在研究在 Java 中使用 YYYY 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

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

原文由 Bob 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 555
2 个回答

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 天? .有关详细信息,请参阅其他答案,例如 我的这个和我这个以 获取更多详细信息。提示:“elapsed”是关键搜索词。

使用 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

原文由 Basil Bourque 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 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)

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

 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,所以我省略了如何使用其他库解决您的问题的答案。

原文由 Meno Hochschild 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题