编程语言
首页 > 编程语言> > 如何使用java中的当前和本地夏令时以及时区信息将joda LocalDateTime对象设置为指定时间

如何使用java中的当前和本地夏令时以及时区信息将joda LocalDateTime对象设置为指定时间

作者:互联网

我正在尝试创建一个java.sql.Time对象来查询SQL数据库中的时间类型,但我正在使用joda来解析我收到的字符串.

我尝试过几种不同的方法.这是我最近的一次.

protected Time startTime = null;
protected static final String dateFormat = "HH:mm:ssZ";
protected static final DateTimeFormatter formatter = DateTimeFormat.forPattern(dateFormat);
public TimeBetweenFilter(String fieldName, String type, String value) {
    super(fieldName, type, value);
    String [] times = value.split("\\|");
    if(times.length == 2 && !times[0].isEmpty() && !times[1].isEmpty()){
        try{
            LocalDateTime current = LocalDateTime.now();
            LocalDateTime timeFromEpoch= new LocalDateTime(formatter.parseDateTime(times[0]));
            startTime = new Time(timeFromEpoch.withDate(current.getYear(), current.getMonthOfYear(), current.getDayOfMonth()).toLocalTime().toDateTimeToday().getMillis());
        }catch (Exception e){
           ...
        }

但输出总是比收到的输入落后1小时.例如,如果输入是UTC的10:30:00,则startTime应该是当地时间的4:30:00.但相反,我得到3:30.

解决了

DateTime beginning = new DateTime(DateTimeZone.UTC).toDateMidnight().toDateTime().plus(DateTime.parse(times[0], formatter).getMillis());
startTime = new Time(beginning.getMillis());

创建一个新日期,今天早上午夜,时区UTC,然后以毫秒为单位添加UTC时间.然后它被转换为java.sql.Time对象.

解决方法:

LocalDateTime在逻辑上不具有任何时区或DST信息.这就是重点 – 它是“本地的”而不是任何特定的时区.不同时区的两个人可能都在同一个当地日期/时间醒来,但这并不意味着他们是同一时刻.

如果您需要包含时区的类型,则应使用DateTime.

编辑:好的,一种方法是采取“今天在本地时区”,解析时间到LocalTime,结合两个形成一个LocalDateTime,将其转换为UTC的DateTime,然后将该DateTime转换为本地时区代替.困难在于结束日期可能不一样,在这种情况下,您可能需要添加或减去一天.然后,由于DST的变化,这可能会改变时间,这使得它更难.可能会有令人讨厌的角落案件需要考虑.

虽然开始时你的要求很奇怪 – 只有一个UTC时间,你想在当地时区的日期/时间使用它是很奇怪的.也许如果你提供更多的背景,那将有所帮助.

标签:java,mysql,jodatime,datetime-parsing
来源: https://codeday.me/bug/20190629/1325557.html