繁体   English   中英

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

[英]How do I set a joda LocalDateTime object to a specified time with current and local daylight savings and time zone information in java

我正在尝试创建一个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时间,你想在当地时区的日期/时间使用它是很奇怪的。 也许如果你提供更多的背景,那将有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM