[英]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());
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.Date
与java.sql.Date
您可能会混淆这对不幸的名字错误的类。 第一个是UTC时间类型的日期。 第二种是仅日期类型。 实际上,第二个假装为仅日期类型,但实际上将时间设置为00:00:00。 更糟糕的是,第二个继承自第一个,但是文档指示我们忽略该事实。
混乱? 是。 这些糟糕的课程设计得很差。 避免他们。
您正在使用麻烦的旧日期时间类,这些类早在几年前就被java.time类所取代。
Instant
java.util.Date
类由java.time.Instant
替换。 Instant
类以UTC表示时间轴上的时刻,分辨率为纳秒 (最多十进制的九(9)位数字)。
LocalDate
java.sql.Date
类由java.time.LocalDate
替换。 LocalDate
类表示没有日期和时区的仅日期值。
从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对象与数据库交换日期时间值,而不是仅交换字符串,就像对数字和数据库所理解的其他数据类型一样。 仅将字符串用于传达文本值。
要将检索到的值与当前时刻进行比较,请使用isBefore
, isAfter
和equals
类的Instant
类。
Instant now = Instant.now() ;
…
Instant instant = myResultSet.getObject( … , Instant.class ) ;
boolean isPast = instant.isBefore( now ) ;
if ( isPast ) {
…
}
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的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中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.