例えば、ユニットテストで現在時刻返すメソッドを固定日付で返したい、などのケースがある。
implementation 'joda-time:joda-time:2.11.1'
import org.joda.time.DateTime;
import org.joda.time.DateTimeUtils;
public class JodaTImeSsample {
public static void main(String[] args) {
DateTimeUtils.setCurrentMillisFixed(DateTime.parse("2010-06-30T01:20").getMillis());
DateTime now = DateTime.now();
System.out.println(now); // 2010-06-30T01:20:00.000+09:00
DateTimeUtils.setCurrentMillisSystem(); // 現在時刻を返すようにリセット
}
}
DateTimeUtils.setCurrentMillisFixed
は下記のようにstatic
変数を書き換える。volatile
付いてるとはいえ、マルチスレッドで何度も書き換えるのはちょっと怖い。ユニットテストを平行に実行しなければ問題は無い……とは思うが。
private static volatile MillisProvider cMillisProvider = SYSTEM_MILLIS_PROVIDER;
public static final void setCurrentMillisFixed(long fixedMillis) throws SecurityException {
checkPermission();
cMillisProvider = new FixedMillisProvider(fixedMillis);
...
新規にJoda-Time使うことは無いと思われるが、既存部分についてはやはり後発のjava.time.Clock
を使う方が良いだろう。
import java.time.Clock;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
public class JodaTImeSsample {
public static void main(String[] args) {
Clock c = Clock.fixed(Instant.parse("2007-12-03T10:15:30.00+09:00"), ZoneId.systemDefault());
LocalDateTime now = LocalDateTime.now(c);
System.out.println(now); // 2007-12-03T10:15:30
}
}