DB和Java时间日期比较和转换

问题描述 投票:0回答:2

我在Java中以newValue的形式获取变量

public void reTrigger() {
    Date date1 = new Date();
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH.mm.ss");

    squery: "select newValue from SAVE_TXN WHERE ROWID = 1"
(newValue is of type nvarchar2)

    String vidtime = sdf.format(parser.getValueOf("newValue")); //parser is another method which parses the squery 
String currentDate = sdf.format(date1);
}

现在newvalue包含日期和时间,如:DB中的'2020/05/17 18.30.44',我正在获取vidtime。

现在,我想用java中的currentDate减去该vidtime,并检查它是否大于或等于120小时。如何进行 ?

java oracle jdbc time type-conversion
2个回答
2
投票

您使用的是可怕的日期时间类,而该类早已被采用了JSR 310的现代java.time类所取代。

您应该从数据库中获取日期时间值,而不是字符串。从JDBC 4.2开始,我们可以与数据库交换java.time类。参见PreparedStatement::setObjectResultSet::getObject

[对于类型为TIMESTAMP WITH TIME ZONE的数据库列,以OffsetDateTime的形式进行检索(不幸的是,JDBC 4.2却不幸地省略了对更常用的InstantZonedDateTime类的支持)。对于类型为TIMESTAMP WITHOUT TIME ZONE的数据库列,以LocalDateTime的形式检索。

如果面对字符串输入,请使用DateTimeFormatter类进行解析。

您的输入缺少时区或UTC偏移量的指示器。因此,我们必须将其解析为LocalDateTime

DateTimeFormatter f = DateTimeFormatter.ofPattern(  "uuuu/MM/dd HH.mm.ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

捕获当前时刻需要一个时区。对于任何给定的时刻,日期和时间在全球范围内都会有所不同。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdtNow = ZonedDateTime.now( z ) ;

我们无法将当前时刻(zdt)与您的输入ldt进行比较。您的输入和LocalDateTime对象并不代表时刻,也不是时间轴上的特定点。举个例子,2020/05/17 18.30.44。我们不知道这是否意味着17日下午6:30在东京,图卢兹或托莱多–所有不同的时刻,在时间线上相隔几个小时。

所以您写的问题无法解决。

如果您确定某个时区适用于您的输入字符串,请应用时区以产生一个ZonedDateTime

ZoneId zIntended = ZoneOf.( "Africa/Tunis" ) ;
ZonedDateTime zdtIntended = ldt.atZone( zIntended ) ;

计算经过时间为Duration

Duration d = Duration.between( zdtNow , zdtIntended ) ;
if( d.toHours() > 20 ) { … }

1
投票

也许像这样:

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Test {
    public static void main(String[] args) {
        final LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        final LocalDateTime dateToCompare = LocalDateTime.parse("2020-05-28 02:05:45",formatter);
        final long hours = Duration.between(now, dateToCompare).toHours();
        System.out.print(hours);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.