Java 基于年龄的Joda时间设置日期对象
我试图为某个类编写测试用例。我想将测试用户的年龄设置为某个值,但我不想处理年龄计算和/或使junit测试用例独立于时间,这要归功于我的@SkinnyJ 那么有没有一种方法可以做到:Java 基于年龄的Joda时间设置日期对象,java,date,jodatime,Java,Date,Jodatime,我试图为某个类编写测试用例。我想将测试用户的年龄设置为某个值,但我不想处理年龄计算和/或使junit测试用例独立于时间,这要归功于我的@SkinnyJ 那么有没有一种方法可以做到: LocalDate birthday = new LocalDate(72Y3M); 72岁3个月是用户的理想年龄。然后joda time会取下这个数字,计算出他/她的生日应该是那个年龄,然后返回那个日期。所以在这种情况下,生日应该是1943年10月8日 尝试1: public LocalDate setUsers
LocalDate birthday = new LocalDate(72Y3M);
72岁3个月是用户的理想年龄。然后joda time会取下这个数字,计算出他/她的生日应该是那个年龄,然后返回那个日期。所以在这种情况下,生日应该是1943年10月8日
尝试1:
public LocalDate setUsersAge(int years, int months, int days) {
LocalDate birthday = new LocalDate();
birthday.minusYears(years);
birthday.minusMonths(months);
birthday.minusDays(days);
return birthday
}
尝试2:
public LocalDate setUsersAge(int years, int months, int days) {
Period age = new Period();
age.withYears(years);
age.withMonths(months);
age.withDays(days);
return birthday.minus(age);
}
虽然这两种方法都能完成任务,但我只是不喜欢代码的外观。有没有更干净的方法可以做到这一点?我认为这是实现目标的一种相当干净的方法:
public LocalDate setUsersAge(int years, int months, int days) {
return LocalDate.now().minusYears(years).minusMonths(months).minusDays(days);
}
编辑:感谢Basil Bourque的评论,如果您担心时区问题,可以执行以下操作:
public LocalDate setUsersAge(int years, int months, int days, DateTimeZone timeZone) {
return LocalDate.now(timeZone).minusYears(years).minusMonths(months).minusDays(days);
}
答案很好,但要知道时区对于确定今天的日期至关重要。此代码隐式依赖于JVM的当前默认时区。该默认值可以随时更改,即使在运行时也是如此。我建议显式地将预期/期望的时区传递给调用
now
方法。@BasilBourque感谢您的评论。你当然是对的。我总是在我的生产代码中传递一个时区,但我假设这些都是单元测试,所以所有测试都将在同一个JVM上完成。但是,安全总比后悔好:)