我试图使用a java.util.Date
作为输入,然后使用它创建查询-所以我需要一个java.sql.Date
。
我很惊讶地发现它不能隐式或显式地进行转换-但我什至不知道该怎么做,因为Java API对我来说还很新。
import java.sql.*
我的代码中有一个,它覆盖了java.util.date,因此在分配对后者(而不是第一个)合适的日期值时造成麻烦。HTH
DATE
表示仅日期。
我试图使用a java.util.Date
作为输入,然后使用它创建查询-所以我需要一个java.sql.Date
。
我很惊讶地发现它不能隐式或显式地进行转换-但我什至不知道该怎么做,因为Java API对我来说还很新。
import java.sql.*
我的代码中有一个,它覆盖了java.util.date,因此在分配对后者(而不是第一个)合适的日期值时造成麻烦。HTH
DATE
表示仅日期。
Answers:
如何将java.util.Date转换为java.sql.Date?
别。这两类都过时了。
java.util.Date
和java.sql.Date
。使用的示例查询PreparedStatement
。
myPreparedStatement.setObject(
… , // Specify the ordinal number of which argument in SQL statement.
myJavaUtilDate.toInstant() // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
.toLocalDate() // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)
更换:
如果您尝试使用仅日期值(无日期,无时区),请使用LocalDate
类而不是java.util.Date
。
在Java 8和更高版本中,新的java.time软件包取代了与Java早期版本捆绑在一起的麻烦的旧日期时间类。请参阅Oracle教程。许多功能已被后移植到Java 6和7在ThreeTen-反向移植和在进一步适于到Android ThreeTenABP。
一个SQL数据类型 DATE
,就是要日期而已,没有时区没有时间的日和。直到java.time.LocalDate
Java 8 为止,Java 才从未有过这样的类† 。让我们通过根据特定时区获取今天的日期来创建这样的值(时区对于确定日期是重要的,因为巴黎要比蒙特利尔早得多,例)。
LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) ); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".
至此,我们可以完成了。如果您的JDBC驱动程序符合以下法规JDBC 4.2规范,你应该能够传递一个LocalDate
通过setObject
一个PreparedStatement
存储到一个SQL日期字段。
myPreparedStatement.setObject( 1 , localDate );
同样,用于ResultSet::getObject
从SQL DATE列提取到Java LocalDate
对象。在第二个参数中指定类将使您的代码类型安全。
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
换句话说,在JDBC 4.2或更高版本中,整个问题无关紧要。
如果JDBC驱动程序不能以这种方式执行,则需要回退到转换为java.sql类型。
要进行转换,请使用添加到旧日期时间类的新方法。我们可以调用java.sql.Date.valueOf(…)
来转换LocalDate
。
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
并朝另一个方向发展。
LocalDate localDate = sqlDate.toLocalDate();
java.util.Date
尽管应避免使用旧的日期时间类,但在使用现有代码时可能会被迫使用。如果是这样,则可以与java.time进行相互转换。
完成该Instant
课程,该课程代表UTC时间轴上的时刻。An的Instant
概念与相似java.util.Date
。但是请注意,Instant
它的分辨率最高为纳秒,而分辨率java.util.Date
只有毫秒。
要进行转换,请使用添加到旧类中的新方法。例如java.util.Date.from( Instant )
和java.util.Date::toInstant
。
Instant instant = myUtilDate.toInstant();
要确定日期,我们需要时区的上下文。对于任何给定时刻,日期都会随时区在全球范围内变化。申请ZoneId
获得ZonedDateTime
。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
†java.sql.Date类假装为仅日期,没有一天的时间,但实际上是一天的时间,已调整为午夜时间。令人困惑?是的,旧的日期时间类很烂。
该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-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。
没关系....
public class MainClass {
public static void main(String[] args) {
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
System.out.println("utilDate:" + utilDate);
System.out.println("sqlDate:" + sqlDate);
}
}
epochseconds
毫秒数1,JAN,1970
。但是,如果我们要在此日期之前存储某个人的日期,该怎么办?...或类似的东西0000-00-00 as default
使用其他答案,您可能会在时间信息方面遇到麻烦(将日期与意外结果进行比较!)
我建议:
java.util.Calendar cal = Calendar.getInstance();
java.util.Date utilDate = new java.util.Date(); // your util date
cal.setTime(utilDate);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
java.sql.Date sqlDate = new java.sql.Date(cal.getTime().getTime()); // your sql date
System.out.println("utilDate:" + utilDate);
System.out.println("sqlDate:" + sqlDate);
java.util.Date
,java.util.Calendar
和java.text.SimpleDateFormat
现在已成为旧版)被Java 8及更高版本中内置的java.time类取代。请参见Oracle 教程。
我是新手:经过大量运行后,此方法可行。思想可能有用
String bufDt = bDOB.getText(); //data from form
DateFormat dF = new SimpleDateFormat("dd-MM-yyyy"); //data in form is in this format
Date bbdt = (Date)dF.parse(bufDt); // string data is converted into java util date
DateFormat dsF = new SimpleDateFormat("yyyy-MM-dd"); //converted date is reformatted for conversion to sql.date
String ndt = dsF.format(bbdt); // java util date is converted to compatible java sql date
java.sql.Date sqlDate= java.sql.Date.valueOf(ndt); // finally data from the form is convered to java sql. date for placing in database
java.util.Date
,java.util.Calendar
和java.text.SimpleDateFormat
现在已成为旧版)被Java 8及更高版本中内置的java.time类取代。请参见Oracle 教程。
java.sql.Date sqlDate = new java.sql.Date(javaDate.getTime());
这里的javaDate是java.util.Date的实例
比较两个日期(util.date或sql.date)的方法
public static boolean isSameDay(Date a, Date b) {
Calendar calA = new GregorianCalendar();
calA.setTime(a);
Calendar calB = new GregorianCalendar();
calB.setTime(b);
final int yearA = calA.get(Calendar.YEAR);
final int monthA = calA.get(Calendar.MONTH);
final int dayA = calA.get(Calendar.DAY_OF_YEAR);
final int yearB = calB.get(Calendar.YEAR);
final int monthB = calB.get(Calendar.MONTH);
final int dayB = calB.get(Calendar.DAY_OF_YEAR);
return yearA == yearB && monthA == monthB && dayA == dayB;
}
我认为最好的转换方法是:
static java.sql.Timestamp SQLDateTime(Long utilDate) {
return new java.sql.Timestamp(utilDate);
}
Date date = new Date();
java.sql.Timestamp dt = SQLDateTime(date.getTime());
如果要将dt
变量插入到SQL表中,可以执行以下操作:
insert into table (expireAt) values ('"+dt+"');
您可以使用此方法将util date转换为sql date,
DateUtilities.convertUtilDateToSql(java.util.Date)
如果您使用的是MySQL,则可以将日期列传递给该日期的字符串表示形式
所以我使用DateFormatter类对其进行格式化,然后在sql语句或prepared语句中将其设置为String
这是代码图:
private String converUtilDateToSqlDate(java.util.Date utilDate) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sqlDate = sdf.format(utilDate);
return sqlDate;
}
字符串日期= converUtilDateToSqlDate(otherTransaction.getTransDate());
//然后在您的sql语句中传递此日期