以下代码似乎转换为BST。我在做些傻事吗?
import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
public class Test {
@Test
public void testTimeInterval(){
String DAY_SHIFT="08:00-17:15";
System.out.println(toInterval(DAY_SHIFT, "America/New_York", "UTC"));
}
public static final String TIME_FORMAT = "HH:mm";
public static List<LocalTime> toInterval(String str, String sourceTZ, String destTZ) {
if (!StringUtils.isBlank(str)){
final DateTimeFormatter timeFormat = DateTimeFormat.forPattern(TIME_FORMAT).withZone(DateTimeZone.forID(sourceTZ));
String[] tokens = str.split("-");
if (tokens!=null && tokens.length==2){
try{
long start = timeFormat.parseMillis(tokens[0]);
long end = timeFormat.parseMillis(tokens[1]);
DateTime startTime = new DateTime(start, DateTimeZone.forID(sourceTZ)).toDateTime(DateTimeZone.forID(destTZ));
DateTime endTime = new DateTime(end, DateTimeZone.forID(sourceTZ)).toDateTime(DateTimeZone.forID(destTZ));
return Arrays.asList(new LocalTime(startTime, DateTimeZone.forID(destTZ)),
new LocalTime(endTime, DateTimeZone.forID(destTZ)));
}
catch (IllegalArgumentException e){
e.printStackTrace();
}
}
};
return null;
}
}
以上代码打印[13:00:00.000, 22:15:00.000]
。根据{{3}}链接,一小时应该是[12:00:00.000, 21:15:00.000]
答案 0 :(得分:2)
您仅提供了一天的时间。你对哪一天感兴趣?这将影响到UTC的映射。如果您的意思是今天,您应该明确指定。看起来您真的想要解析为LocalTime
,然后通过将其与某些适当的LocalDateTime
相结合来构建适当的LocalDate
(这取决于您要实现的目标)。
我的猜测是它实际上是在1970年1月1日这样做 - 此时纽约的UTC偏移为-5,而不是-4。您可以通过完整记录startTime
和endTime
来验证这一点。
另外为了简单起见,我强烈建议您在方法开始时调用DateTimeZone.forId
两次,而不是每次需要一个区域。
如果本地日期/时间不明确,或者由于DST转换而可能会跳过,您还应该考虑要发生的事情。如果你选择一个不包含任何过渡的日期,那么这当然不会发生。