【发布时间】:2018-08-01 16:02:33
【问题描述】:
有没有办法在 Joda-Time 中配置夏令时转换时间?
例如,加利福尼亚州的春季过渡期将于 3 月 11 日凌晨 2:00 开始。
我想配置 Joda-Time(我的应用正在使用),以便过渡在特定时间开始(例如 2/21 下午 4 点),以便我可以根据日光测试我的应用中的一些逻辑按当前时间保存。
【问题讨论】:
有没有办法在 Joda-Time 中配置夏令时转换时间?
例如,加利福尼亚州的春季过渡期将于 3 月 11 日凌晨 2:00 开始。
我想配置 Joda-Time(我的应用正在使用),以便过渡在特定时间开始(例如 2/21 下午 4 点),以便我可以根据日光测试我的应用中的一些逻辑按当前时间保存。
【问题讨论】:
你可以扩展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 点(夏令时开始前一小时),因此偏移量是标准的 (-08:00)。
然后,1 小时后,应该是下午 4 点,但由于 DST 开始,它被转移到下午 5 点,并且偏移变为 -07:00。
【讨论】: