Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于年龄的Joda时间设置日期对象_Java_Date_Jodatime - Fatal编程技术网

Java 基于年龄的Joda时间设置日期对象

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

我试图为某个类编写测试用例。我想将测试用户的年龄设置为某个值,但我不想处理年龄计算和/或使junit测试用例独立于时间,这要归功于我的@SkinnyJ

那么有没有一种方法可以做到:

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上完成。但是,安全总比后悔好:)