我在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小时。如何进行 ?
您使用的是可怕的日期时间类,而该类早已被采用了JSR 310的现代java.time类所取代。
您应该从数据库中获取日期时间值,而不是字符串。从JDBC 4.2开始,我们可以与数据库交换java.time类。参见PreparedStatement::setObject
和ResultSet::getObject
。
[对于类型为TIMESTAMP WITH TIME ZONE
的数据库列,以OffsetDateTime
的形式进行检索(不幸的是,JDBC 4.2却不幸地省略了对更常用的Instant
和ZonedDateTime
类的支持)。对于类型为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 ) { … }
也许像这样:
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);
}
}