繁体   English   中英

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

[英]How to convert java.util.Date to java.sql.Date?

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

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

没关系....

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

tl;博士

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

别。

两个Date类都过时了。 SunOracleJCP社区在几年前随着JSR 310定义java.time类的一致采用而放弃了那些遗留的日期时间类。

  • 在 JDBC 4.2 或更高版本java.util.Date使用java.time类而不是旧的java.util.Datejava.sql.Date
  • 如果与尚未更新为 java.time 的代码互操作,则转换为 java.time 或从 java.time 转换。
遗产 现代的 转换
java.util.Date java.time.Instant java.util.Date.toInstant()
java.util.Date.from( Instant )
java.sql.Date java.time.Date 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 8 及更高版本中,与早期 Java 版本捆绑在一起的麻烦的旧日期时间类已被新的java.time 包所取代。 请参阅Oracle 教程 许多功能已被后移植到Java 6和7在ThreeTen-反向移植和在进一步适于到Android ThreeTenABP

SQL 数据类型DATE意味着只有日期,没有时间和时区。 在 Java 8 中的java.time.LocalDate之前,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 规范,您应该能够通过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转换

虽然您应该避免使用旧的日期时间类,但在使用现有代码时可能会被迫使用。 如果是这样,您可以转换为/从 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

java.time框架内置于 Java 8 及更高版本中。 这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar ,和SimpleDateFormat

要了解更多信息,请参阅Oracle 教程 并在 Stack Overflow 上搜索许多示例和解释。 规范是JSR 310

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

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

从哪里获得 java.time 类?

哪个 java.time 库与哪个版本的 Java 或 Android 一起使用的表

ThreeTen-Extra项目用额外的类扩展了 java.time。 该项目是未来可能添加到 java.time 的试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

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

我建议:

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 日期对象返回转换后的 SQL 日期。

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

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

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

有关更多信息,您可以查看此问题

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

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

其中pickDate是JXDatePicker的对象

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

首先格式化您的 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);
java.sql.Date sqlDate = new java.sql.Date(javaDate.getTime());

这里 javaDate 是 java.util.Date 的实例

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

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)

我是一个新手:经过多次运行后,这行得通。 想法可能有用

     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

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

试试这个

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

我认为最好的转换方法是:

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

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

DateFormat fm= new SimpleDateFormatter();

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

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

然后它会解析你的日期

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

DateUtilities.convertUtilDateToSql(java.util.Date)

我正在尝试以下编码效果很好。

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

如果您使用的是 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语句中传递这个日期

暂无
暂无

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

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