有没有办法在Joda-Time中配置夏令时转换时间?
例如,加利福尼亚的春季过渡将于3月11日凌晨2点开始。
我想配置Joda-Time(我的应用正在使用),以便转换从特定时间开始(例如2月21日下午4点),以便我可以在我的应用中测试一些逻辑,具体取决于每个当前时间的夏令时。
答案 0 :(得分:0)
您可以扩展org.joda.time.DateTimeZone
:
public class FakeTimeZone extends DateTimeZone {
private DateTime dstStart;
private DateTimeZone zone;
protected FakeTimeZone(String id) {
super(id);
this.zone = DateTimeZone.forID(id);
// DST starts at 21/Feb/2018, at 4 PM
this.dstStart = new DateTime(2018, 2, 21, 16, 0, 0, 0, zone);
}
@Override
public String getNameKey(long instant) {
return this.getID();
}
@Override
public int getOffset(long instant) {
// check if it's in DST
if (dstStart.getMillis() <= instant) {
// DST, offset is 1 hour ahead the standard - value must be in milliseconds
return this.zone.getStandardOffset(instant) + 3600000;
}
return this.zone.getStandardOffset(instant);
}
@Override
public int getStandardOffset(long instant) {
return this.zone.getStandardOffset(instant);
}
@Override
public boolean isFixed() {
return false;
}
@Override
public long nextTransition(long instant) {
if (instant < dstStart.getMillis()) {
return dstStart.getMillis();
}
return instant;
}
@Override
public long previousTransition(long instant) {
if (instant > dstStart.getMillis()) {
return dstStart.getMillis();
}
return instant;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof FakeTimeZone) {
return getID().equals(((FakeTimeZone) obj).getID());
}
return false;
}
}
它使用你在构造函数中传递的时区的相同偏移量,唯一的区别是DST过渡 - 在这种情况下,我只使用一个并忽略其余的 - 但你可以更改上面的代码和制作一个更复杂的逻辑来考虑所有其他过渡+你的自定义过渡。
然后你就这样使用它:
// 1 hour before DST starts
DateTime d = new DateTime(2018, 2, 21, 15, 0, 0, 0, new FakeTimeZone("America/Los_Angeles"));
// This prints 2018-02-21T15:00:00.000-08:00 (standard offset)
System.out.println(d);
// 1 hour later, DST is in effect, it prints 2018-02-21T17:00:00.000-07:00
System.out.println(d.plusHours(1));
请注意,第一个日期是下午3点(DST开始前一小时),因此偏移量是标准( -08:00 )。
然后,1小时后,它应该是下午4点,但由于DST开始,它会转移到下午5点,偏移量变为 -07:00 。