繁体   English   中英

来自SQL的Java中的日期时间

[英]Date time in java from SQL

我有这段代码

while(activecheck.next()){
    Date status;
    String vincheck;
    Date curr = new Date();
    int datecheck;
    status = activecheck.getDate(8);
    vincheck = activecheck.getString(2);
    String update = "UPDATE Auctions SET status = '"+inactive+"' WHERE vin = '"+vincheck+"'";
    datecheck = status.compareTo(curr);

    if(datecheck < 0){  
        stmt6.executeUpdate(update);
    }
}

通过mysql表进行迭代,以检查无效出价。 我正在尝试检查sql行中列出的日期和时间是否已通过当前时间。 但是,无论何时我这样做,似乎都只是在比较日期,而不是时间。 这可能是什么原因?

这是我使用的格式: yyyy-MM-dd HH:mm:ss`

您应该使用称为时间戳的类型代替日期。 这样您将覆盖日期和当前时间

  Timestamp timestamp = new Timestamp(System.currentTimeMillis());

TL;博士

if( 
    myResultSet.getObject( … , Instant.class )  // Retrieve `Instant` (a moment in UTC) from database using JDBC 4.2 or later.
               .isBefore( Instant.now() )       // Comparing to the current moment captured in UTC.
)
{ 
    … 
}

java.util.Datejava.sql.Date

您可能会混淆这对不幸的名字错误的类。 第一个是UTC时间类型的日期。 第二种是仅日期类型。 实际上,第二个假装为仅日期类型,但实际上将时间设置为00:00:00。 更糟糕的是,第二个继承自第一个,但是文档指示我们忽略该事实。

混乱? 是。 这些糟糕的课程设计得很差。 避免他们。

java.time

您正在使用麻烦的旧日期时间类,这些类早在几年前就被java.time类所取代。

Instant

java.util.Date类由java.time.Instant替换。 Instant类以UTC表示时间轴上的时刻,分辨率为纳秒 (最多十进制的九(9)位数字)。

LocalDate

java.sql.Date类由java.time.LocalDate替换。 LocalDate类表示没有日期和时区的仅日期值。

JDBC 4.2

从JDBC 4.2及更高版本开始,您可以直接与数据库交换java.time类。 无需再使用java.sql或java.util日期时间类型。

提示:养成始终使用PreparedStatement以避免SQL注入风险的习惯。 一旦习惯了,就没有更多的工作了。

Instant instant = Instant.now() ;  // Capture the current moment in UTC.
myPreparedStatement.setObject( … , instant ) ;

和检索。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

智能对象,而不是哑字符串

这是我使用的格式:yyyy-MM-dd HH:mm:ss`

存储在数据库中的日期时间值没有“格式”。 这些值由某种与我们无关的内部定义的机制存储。 它们不是字符串(也就是说,不在任何严重的数据库中)。

您的数据库和Java日期时间对象可以解析表示日期时间值的字符串以创建该值。 他们可以生成一个字符串来表示该值。 但是字符串和日期时间值是不同的且分开的,不应混为一谈。

使用java.time对象与数据库交换日期时间值,而不是仅交换字符串,就像对数字和数据库所理解的其他数据类型一样。 仅将字符串用于传达文本值。

相比

要将检索到的值与当前时刻进行比较,请使用isBeforeisAfterequals类的Instant类。

Instant now = Instant.now() ;
…
Instant instant = myResultSet.getObject( … , Instant.class ) ;
boolean isPast = instant.isBefore( now ) ;
if ( isPast ) { 
    … 
}

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.DateCalendarSimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310

您可以直接与数据库交换java.time对象。 使用与JDBC 4.2或更高版本兼容的JDBC驱动程序 不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

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

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