【发布时间】:2011-10-20 11:38:08
【问题描述】:
我是 Java 新手。我想要的是当我将开始日期和结束日期作为参数传递给函数时,我想获取开始日期和结束日期之间的天数、月数和年数。
【问题讨论】:
-
你在这方面做过什么工作吗?能否请您展示您到目前为止编写的代码(核心逻辑)?
-
这是作业吗?请这样标记它?
我是 Java 新手。我想要的是当我将开始日期和结束日期作为参数传递给函数时,我想获取开始日期和结束日期之间的天数、月数和年数。
【问题讨论】:
如果你使用JodaTime,很简单:
DateTime start = // your start date
DateTime end = // your end date
int days = Days.daysBetween(start, end).getDays();
int months = Months.monthsBetween(start, end).getMonths();
int years = Years.yearsBetween(start, end).getYears();
【讨论】:
Period.between(
LocalDate.of( 2011 , 1 , 1) ,
LocalDate.now( ZoneId.of( "America/Montreal" ) )
).toString(); // Example: P5Y4M2D
Answer by Floyd 正确但已过时。 Joda-Time 项目处于维护模式,其团队建议迁移到 java.time 类。
LocalDateLocalDate 类表示没有时间和时区的日期。
LocalDate start = LocalDate.of( 2011 , 1 , 1 );
LocalDate stop = LocalDate.of( 2016 , 1 , 15 );
ChronoUnitChronoUnit 类计算经过的时间。
long elapsedInYears = ChronoUnit.YEARS.between( start , stop );
long elapsedInMonths = ChronoUnit.MONTHS.between( start , stop );
long elapsedInDays = ChronoUnit.DAYS.between( start , stop );
Period如果您想将一个时间跨度分解为若干年和若干个月和若干天,则使用Period 类。
Period p = Period.between( start , stop );
要获得方便的标准ISO 8601 格式化字符串表示,请调用toString。格式为PnYnMnDTnHnMnS,其中P 标记开始,T 将年-月-日与小时-分钟-秒分开。所以一个半月是P1M15D。
String output = p.toString();
如果您希望每个部分都作为一个数字,请调用 getter 方法。
int years = p.getYears();
int months = p.getMonths();
int days = p.getDays();
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date、.Calendar 和java.text.SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到 java.time。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。
大部分 java.time 功能在ThreeTen-Backport 中向后移植到Java 6 和7,并进一步适应ThreeTenABP 中的Android(参见How to use…)。
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 等等。
【讨论】: