我创建了一个类,其中有两个字段需要是日期,start_date
和 date_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
到目前为止,我已经找到了很多使用日历和日期类来格式化日期的方法,但还没有找到一种看起来可行的方法,因为大多数日期最终都是字符串。非常感谢任何建议/小例子!此外,任何指向示例的链接都很棒!
最佳答案
tl;dr
通过加/减天数从一个日期移动到另一个日期。
LocalDate.now(
ZoneId.of( "Pacific/Auckland" )
)
.minusDays( 5 )
计算两个日期之间经过的天数、月数和年数。
ChronoUnit.DAYS.between( start , stop )
解析
首先,您必须将字符串输入解析为日期时间对象。然后你开始执行你的 business logic与那些对象。
不要再将日期时间值视为字符串,那会让您抓狂。我们在代码中使用日期时间对象;我们使用该日期时间对象的字符串表示形式与用户或其他应用程序交换数据。
在 Java 8 及更高版本中,使用 java.time框架。参见 Tutorial .
您只需要一个日期,不需要时间,所以我们可以使用 LocalDate
类。
那个时髦的双冒号语法是 method reference ,一种说明其他代码应调用什么方法的方法。
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 上多次解决。例如,How to subtract X days from a date using Java calendar? .有关详细信息,请参阅其他答案,例如 this one by me和 this one by me更多细节。提示:“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 );
localDate: 2015-01-02 to 2015-01-09 in days: 7
关于Java:减去日期的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33530011/