简述
通过添加/减去若干天数来移动日期。
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
now()
能否从程序后面的日期中减去,例如LocalDate localDate = formatter.parse(input, LocalDate::from);
? - BobLocalDate today = LocalDate.now(ZoneId.of("America/Montreal"));
。时区在确定日期方面至关重要(好好想一想!)。对于一个字符串,使用与上述相同的格式化程序:String output = today.format(formatter);
。在此主题上搜索其他StackOveflow页面。 - Basil Bourque.getDays
方法不能获取两个日期之间的绝对天数,它只会获取相对于月份/年份的天数。而ChronoUnit
方法则没有这个缺点。 - Logister