4

我正在尝试创建一个 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 对象。

4

1 回答 1

3

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

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

编辑:好的,一种方法是采用“今天在当地时区”,将时间解析为 a LocalTime,将两者结合形成 a LocalDateTime,将其转换为DateTimeUTC 中的 a ,然后将其转换DateTime为当地时区。困难在于结束日期可能不一样,在这种情况下,您可能需要增加或减少一天。由于 DST 的变化,这可能会改变一天中的时间,这使得它变得更加困难。可能会有令人讨厌的极端情况需要考虑。

感觉你的要求从一开始就很奇怪 -只有一个UTC 时间很奇怪,你想在本地时区的日期/时间中使用它。也许如果您提供更多背景信息,那会有所帮助。

于 2013-09-04T17:00:39.300 回答