如何将java.util.Date转换为java.sql.Date?

时间:2009-02-09 21:16:18

标签: java sql datetime date

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

我很惊讶地发现它无法隐式或显式地进行转换 - 但我甚至不知道如何做到这一点,因为Java API对我来说还是一个新手。

18 个答案:

答案 0 :(得分:458)

...没关系

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

答案 1 :(得分:59)

TL;博士

  

如何将java.util.Date转换为java.sql.Date?

不要。这两个课程都已经过时了。

  • 使用java.time类而不是遗留java.util.Date&使用JDBC 4.2或更高版本的java.sql.Date
  • 如果与尚未更新为java.time的代码进行交互,则转换为/从java.time转换。

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

Table of date-time types in Java (both legacy and modern) and in the SQL standard.

java.time

在Java 8及更高版本中,与早期版本的Java捆绑在一起的麻烦的旧日期时间类已被新的java.time package取代。见Oracle Tutorial。许多功能已经被后端移植到Java 6& ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

SQL data type DATE仅限日期,没有时间,没有时区。 Java在Java 8中直到java.time.LocalDate才真正具有这样的类†。让我们通过根据特定时区获取今天的日期来创建这样的值(时区对于确定日期是重要的,因为新的一天在巴黎早些时候开始比在蒙特利尔,例如)。

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 driver符合JDBC 4.2 spec,则应该能够LocalDate通过setObject PreparedStatement传递到SQL DATE字段。

myPreparedStatement.setObject( 1 , localDate );

同样,使用ResultSet::getObject从SQL DATE列获取到Java LocalDate对象。在第二个参数中指定类会使代码type-safe

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

转换

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

浏览Instant类,它代表UTC时间轴上的一个时刻。 Instant在概念上类似于java.util.Date。但请注意,Instant的分辨率最高为nanoseconds,而java.util.Date的分辨率仅为milliseconds

要转换,请使用添加到旧类的新方法。例如,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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:38)

使用其他答案,您可能会遇到时间信息的麻烦(将日期与意外结果进行比较!)

我建议:

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

答案 3 :(得分:23)

此函数将从java日期对象返回转换后的SQL日期。

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

答案 4 :(得分:18)

java.util.Data转换为java.sql.Data会耗费小时,分钟和秒。如果有可能,我建议你像这样使用java.sql.Timestamp

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

有关详情,请查看this question

答案 5 :(得分:12)

在我从JXDatePicker(java日历)中选择日期并将其作为SQL日期类型存储在数据库中的情况下,以下工作正常..

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

其中pickedDate是JXDatePicker的对象

答案 6 :(得分:5)

此函数将从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;
    }

答案 7 :(得分:3)

首先格式化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);

答案 8 :(得分:2)

java.sql.Date sqlDate = new java.sql.Date(javaDate.getTime());

javaDate是java.util.Date的实例

答案 9 :(得分:2)

我是一个新手:经过多次奔波这个工作。思想可能有用

     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

答案 10 :(得分:2)

这里是将Util Date转换为Sql日期的示例,这是我在项目中使用的一个示例,也可能对您有所帮助。

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)

答案 11 :(得分:1)

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

答案 12 :(得分:0)

试试这个

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

答案 13 :(得分:-1)

我认为转换的最佳方式是:

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

答案 14 :(得分:-3)

您可以使用此方法将实用日期转换为SQL日期,

DateUtilities.convertUtilDateToSql(java.util.Date)

答案 15 :(得分:-3)

我使用以下代码请试用

DateFormat fm= new SimpleDateFormatter();

指定所需日期的格式 例如"DD-MM_YYYY"'YYYY-mm-dd'然后使用java Date数据类型作为

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

然后它会解析你的日期

答案 16 :(得分:-4)

我正在尝试以下编码工作正常。

  

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

答案 17 :(得分:-8)

如果您是usgin,则可以向日期列传递此日期的字符串表示

所以我使用DateFormatter类对其进行格式化,然后在sql语句或预处理语句中将其设置为String

这是代码说明:

private String converUtilDateToSqlDate(java.util.Date utilDate) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String sqlDate = sdf.format(utilDate);
    return sqlDate;
}

String date = converUtilDateToSqlDate(otherTransaction.getTransDate());

//然后在你的sql语句中传递这个日期