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

How to convert java.util.Date to java.sql.Date?

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

我惊讶地发现,它不能隐式或显式地进行转换,但我甚至不知道该怎么做,因为Java API对我来说还是相当新的。


没有关系。。。。

1
2
3
4
5
6
7
8
9
10
11
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_uu data-type/convertfromajavautildateObjectToajavasqldateObject.htm


DR

How to convert java.util.Date to java.sql.Date?

Ok.

不要。这两门课都过时了。好的。

  • 在JDBC 4.2或更高版本中使用java.time类而不是传统的java.util.Datejava.sql.Date
  • 如果与尚未更新为java.time的代码交互操作,则转换为java.time或从java.time转换为java.time。

使用PreparedStatement的示例查询。好的。

1
2
3
4
5
6
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.Times包取代了与Java早期版本捆绑在一起的麻烦旧日期时间类。请参见Oracle教程。大部分功能已经在3TeNeN后端移植到Java 6和7中,并进一步适应了Android的三层版本。好的。

SQL数据类型DATE仅用于日期,没有时间和时区。Java从来没有这样的一个类?直到Java 8中的EDCOX1×10Ω。让我们根据一个特定的时区获取今天的日期来创造这样一个价值(例如,时区对于确定一个日期很重要,因为在巴黎,新的一天比在蒙特利尔早)。好的。

1
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日期字段中。好的。

1
myPreparedStatement.setObject( 1 , localDate );

同样,使用EDCOX1 OR 14来从SQL DealEnter列到Java EDCOX1×5对象。在第二个参数中指定类使代码类型安全。好的。

1
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );

换句话说,在JDBC4.2或更高版本下,整个问题都是不相关的。好的。

如果您的JDBC驱动程序不以这种方式执行,您需要返回到转换java.sql类型。好的。转换为java.sql.date

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

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

往另一个方向走。好的。

1
LocalDate localDate = sqlDate.toLocalDate();

。从java.util.Date转换

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

通过Instant类,它代表了UTC时间轴上的一个时刻。Instant在概念上与java.util.Date相似。但请注意,Instant的分辨率高达纳秒,而java.util.Date的分辨率仅为毫秒。好的。

要转换,请使用添加到旧类中的新方法。例如,java.util.Date.from( Instant )java.util.Date::toInstant。好的。

1
Instant instant = myUtilDate.toInstant();

要确定日期,我们需要时区的上下文。在任何给定的时刻,日期都会随着时区的不同而变化。应用ZoneId获得ZonedDateTime。好的。

1
2
3
ZoneId zoneId = ZoneId.of ("America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();

?java.sql.date类假装只有日期而没有一天中的某个时间,但实际上是一天中的某个时间,调整为午夜时间。困惑?是的,旧的约会课程一团糟。好的。关于java.time

JavaTimeFr框架是在Java 8和之后构建的。这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendar、&SimpleDateFormat。好的。

现在处于维护模式的joda time项目建议迁移到java.time类。好的。

要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规格为JSR 310。好的。

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

在哪里获取java.time类?好的。

  • Java SE 8、Java SE 9、Java SE 10以及以后
    • 内置。
    • 标准JAVA API的一部分与捆绑实现。
    • Java 9增加了一些次要的特性和修复。
  • Java SE 6和Java SE 7
    • 大部分JavaTimeActudio都被移植到TealEnter后端的Java 6和7中。
  • 安卓
    • java.time类的Android包实现的更高版本。
    • 对于早期的Android(<26),threetenabp项目适应threeten backport(如上所述)。看看如何使用三连珠……

threeten额外项目使用额外的类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。好的。好啊.


对于另一个答案,您可能在时间信息方面遇到问题(将日期与意外结果进行比较!)

我建议:

1
2
3
4
5
6
7
8
9
10
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日期。

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


java.util.Data转换为java.sql.Data将减少小时、分钟和秒。因此,如果可能的话,我建议您像这样使用java.sql.Timestamp

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

有关详细信息,您可以查看此问题。


在我从JXDatePicker(JavaCalnter)中提取日期并将其作为SQL日期类型存储在数据库中时,下面的工作很好。

埃多克斯1〔6〕

其中pickedDate是jxdatepicker的对象


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

1
2
3
4
5
6
7
8
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中的日期。

1
2
3
4
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);


我是一个新手:在经历了很多绕圈子之后,这一切都奏效了。思考可能有用

1
2
3
4
5
6
     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


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

1
2
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)

比较两个日期的方法(util.date或sql.date)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 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;
}


试试这个

1
2
3
4
5
6
7
8
9
10
11
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;
}


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

1
2
3
4
5
6
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表中,可以执行以下操作:

1
insert into table (expireAt) values ('"+dt+"');


我用的是下面的代码,请试试看

1
DateFormat fm= new SimpleDateFormatter();

指定所需日期的格式例如EDCOX1、0或EDCOX1(1),然后使用Java日期数据类型作为

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

然后它会分析你的日期


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

1
DateUtilities.convertUtilDateToSql(java.util.Date)


我正在尝试以下代码,但效果很好。

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


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

所以我使用DateFormatter类对其进行格式化,然后在SQL语句或Prepared语句中将其设置为字符串

下面是代码说明:

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

字符串日期=converrutildatetosqldate(otherTransaction.getTransDate());

//然后在SQL语句中传递此日期