如何转换java.util.Date到java.sql.Date?

我试图使用java.util.Date作为输入,然后用它创建一个查询-所以我需要一个java.sql.Date

我惊讶地发现它不能隐式或显式地进行转换——但我甚至不知道如何做到这一点,因为Java API对我来说仍然相当新。

739609 次浏览

别介意…

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);


}


}

解释了它。这个链接是http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm

对于另一个答案,你可能会遇到时间信息的问题(比较日期和意想不到的结果!)

我建议:

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);

如果你在Mysql中使用一个日期列,可以传递这个日期的字符串表示

所以我使用DateFormatter类格式化它,然后将它设置为sql语句或准备语句中的字符串

下面是代码说明:

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语句中传入此日期

比较2个日期的方法。日期或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;
}

这里的例子转换Util日期到Sql日期和ya这是一个例子,我在我的项目中使用的可能对你也有帮助。

java.util.Date utilStartDate = table_Login.getDob();(orwhat ever date your give form obj)
java.sql.Date sqlStartDate = new java.sql.Date(utilStartDate.getTime());(converting date)

试试这个

public static String toMysqlDateStr(Date date) {
String dateForMySql = "";
if (date == null) {
dateForMySql = null;
} else {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateForMySql = sdf.format(date);
}


return dateForMySql;
}

我正在使用以下代码,请尝试一下

DateFormat fm= new SimpleDateFormatter();

指定你想要的日期格式 例如"DD-MM_YYYY"'YYYY-mm-dd',则使用java Date数据类型为

fm.format("object of java.util.date");

然后它会解析你的日期

这个函数将返回一个从java日期对象转换而来的SQL日期。

public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) {
return new java.sql.Date(date.getTime());
}

这个函数将返回一个从java日期对象转换而来的SQL日期。

public static java.sql.Date convertFromJAVADateToSQLDate(
java.util.Date javaDate) {
java.sql.Date sqlDate = null;
if (javaDate != null) {
sqlDate = new Date(javaDate.getTime());
}
return sqlDate;
}

您可以使用此方法将util日期转换为sql日期,

DateUtilities.convertUtilDateToSql(java.util.Date)

java.util.Date转换为java.sql.Date将丢失小时、分钟和秒。所以如果可能的话,我建议你像这样使用java.sql.Timestamp:

prepareStatement.setTimestamp(1, new Timestamp(utilDate.getTime()));

有关更多信息,您可以检查这个问题

博士tl;

如何转换java.util.Date到java.sql.Date?

不喜欢。

这两个Date类都过时了。太阳甲骨文JCP社区多年前就放弃了这些遗留的日期-时间类,一致采用了定义java.time类的JSR 310

  • 使用< em > java.time < / em >类,而不是遗留的java.util.Date &java.sql.Date与JDBC 4.2或更高版本。
  • 转换为/从java。如果与尚未更新到java.time的代码进行交互操作,则为Time。
遗产 现代 转换
java.util.Date java.time.Instant java.util.Date.toInstant()
java.util.Date.from( Instant )
java.sql.Date java.time.LocalDate java.sql.Date.toLocalDate()
java.sql.Date.valueOf( LocalDate )

使用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.
)

更换:

  • Instant代替java.util.Date
    这两个都表示UTC中的一个时刻。但是现在用纳秒代替毫秒。
  • LocalDate代替java.sql.Date
    这两个都表示一个只有日期的值,没有日期和时区。

细节

如果你试图使用只有日期的值(没有时间,没有时区),使用LocalDate类而不是java.util.Date类。

 Java(包括传统和现代)和SQL标准中的日期-时间类型表。 < / >

java.time

在Java 8及以后版本中,与早期版本的Java捆绑在一起的麻烦的旧日期-时间类已被新的java。时间包所取代。看到甲骨文教程。许多功能已经被向后移植到Java 6 &ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

SQL数据类型 DATE意味着只有日期,没有时间和时区。直到Java 8中的java.time.LocalDate, Java才有这样一个精确的类†。让我们通过根据特定的时区获取今天的日期来创建这样一个值(例如,时区在确定日期时很重要,因为巴黎的新一天比Montréal的黎明早)。

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规范,你应该能够通过PreparedStatement上的setObject传递一个LocalDate来存储到SQL DATE字段中。

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

要进行转换,请使用添加到旧日期-时间类中的新方法。我们可以调用java.sql.Date.valueOf(…)来转换LocalDate

java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );

相反的方向。

LocalDate localDate = sqlDate.toLocalDate();

java.util.Date转换

虽然您应该避免使用旧的date-time类,但在使用现有代码时可能会被迫这样做。如果是,您可以转换为/从java.time。

遍历Instant类,它表示UTC时间轴上的一个时刻。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

< em > java.time < / em >框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗产日期-时间类,如java.util.DateCalendar, &SimpleDateFormat

要了解更多信息,请参见< < em >甲骨文教程/ em >。搜索Stack Overflow可以找到很多例子和解释。规格是JSR 310

现在在维护模式中的< em > Joda-Time < / em >项目建议迁移到java.time类。

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

从哪里获取java。时间类?

表的java。“/></a> . time library with哪个版本的Java或Android</p>
<p><a href=< >强ThreeTen-Extra < / >强项目扩展了java。额外的课程时间。这个项目是未来可能添加到java.time的一个试验场。你可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter更多的

首先格式化java.util.Date。然后使用格式化的日期在java.sql.Date中获取日期

java.util.Date utilDate = "Your date"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
final String stringDate= dateFormat.format(utilDate);
final java.sql.Date sqlDate=  java.sql.Date.valueOf(stringDate);

我认为最好的转变方式是:

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+"');

我是一个新手:在四处奔波之后,这是有效的。思想可能有用

     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

我正在尝试以下代码,工作得很好。

< p > java.util。Date utilDate = new java.util.Date();
java.sql.Date

. sqlDate = new java.sql.Date(utilDate)

在我的情况下,从JXDatePicker (java日历)选择日期,并将其存储在数据库中的SQL日期类型,下面的工作很好。

java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());

where pickedDate是JXDatePicker的对象