将edt/est转换为utc

ttygqcqt  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(483)

下面的代码似乎转换为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] . 根据这个链接,应该休息一个小时 [12:00:00.000, 21:15:00.000]

li9yvcax

li9yvcax1#

你只提供了一天中的一段时间。你对哪一天感兴趣?这将影响到到utc的Map。如果你的意思是今天,你应该明确说明。看起来你真的想解析到 LocalTime ,然后构造适当的 LocalDateTime 加入一些适当的 LocalDate (这取决于你想要达到的目标)。
我猜它实际上是在1970年1月1日做的,当时纽约的utc偏移量是-5,而不是-4。您可以通过登录来验证这一点 startTime 以及 endTime 全部。
同样为了简单起见,我强烈建议打电话给你 DateTimeZone.forId 只需两次,在方法开始时,而不是每次需要区域时。
如果本地日期/时间不明确,或者由于dst转换而可能被跳过,您还应该考虑希望发生什么。如果你选择了一个不包含任何转换的日期,这当然永远不会发生。

相关问题