代码之家  ›  专栏  ›  技术社区  ›  flybywire

java.util.Date与java.sql.Date

  •  469
  • flybywire  · 技术社区  · 15 年前

    java.util.Date java.sql.Date :何时使用哪个?为什么?

    5 回复  |  直到 14 年前
        1
  •  603
  •   indivisible foxtangocharlie    10 年前

    恭喜你,我最喜欢JDBC:日期类处理。

    基本上,数据库通常至少支持 日期时间字段的形式,包括日期、时间和时间戳。其中每一个在JDBC和JDBC中都有一个对应的类 java.util.Date

    这意味着 sql.Time

    取决于字段的SQL类型。 PreparedStatement 三个值都有设置器, #setDate() sql.日期 #setTime() 对于 sql.时间 #setTimestamp() 对于 sql.Timestamp

    请注意,如果您使用 ps.setObject(fieldIndex, utilDateObject); 你可以给一个正常的 使用日期 对于大多数JDBC驱动程序来说,它们会很高兴地吞食它,就好像它是正确的类型一样,但是当您随后请求数据时,您可能会注意到您实际上丢失了一些东西。

    我要说的是把毫秒/纳秒保存为普通的long,并将它们转换为您正在使用的任何对象( obligatory joda-time plug ). 一种可行的方法是将日期组件存储为一个长时间组件,将时间组件存储为另一个,例如现在的日期组件是20100221和154536123。这些神奇的数字可以在SQL查询中使用,并且可以从一个数据库移植到另一个数据库,并且可以让您完全避免JDBC/javadateapi:s的这一部分。

        2
  •  65
  •   Community CDub    7 年前

    后期编辑: 从Java8开始,两种语言都不应该使用 java.util.Date 也没有 java.sql.Date 如果你能完全避免它,而是更喜欢使用 java.time 包(基于Joda)而不是其他任何东西。如果您不使用Java 8,下面是最初的回答:


    java.sql.Date日期 -当您调用使用它的库的方法/构造函数时(比如JDBC)。不是别的。对于不显式处理JDBC的应用程序/模块,您不希望向数据库库引入依赖关系。

    日期类型

    • 它不能很好地处理日期,像你这样的人真的认为日期处理类应该这样。

    • 现在,因为j.u.D做得不太好,可怕的是 Calendar 课程介绍。它们也是易变的,而且工作起来很糟糕,如果你没有任何选择,就应该避免。

    • 还有更好的选择,比如 Joda Time API 它甚至可能成为Java7,成为新的官方日期处理API quick search 说不会的)。

    long

        3
  •  20
  •   saravanakumar    8 年前

    唯一可以利用的时间 java.sql.Date 在一个 PreparedStatement.setDate . 否则,请使用 java.util.Date ResultSet.getDate 返回一个 java.sql.Date日期 日期类型 .

        4
  •  12
  •   Israelm    10 年前

    preparedStatement.setDate(1, new java.sql.Date(new java.util.Date().getTime()));
    
        5
  •  9
  •   Basil Bourque    4 年前

    两个都不用。

    这两个类都很糟糕,在设计和实现上都有缺陷。避免像 Plague Coronavirus .

    Date , Calendar , SimpleDateFormat ,等等。

    日期类型

    第一个, 表示以UTC表示的时刻,表示与UTC的偏移量为零小时分秒。

    java.time.Instant文件

    java.time.Instant文件 .

    Instant instant = Instant.now() ;  // Capture the current moment as seen in UTC.
    

    java.time.OffsetDateTime

    Instant 是的基本构造块类 . 要获得更大的灵活性,请使用 OffsetDateTime 设置为 ZoneOffset.UTC

    OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;
    

    可以使用将此对象发送到数据库 PreparedStatement::setObject 具有 JDBC 4.2或更高版本。

    myPreparedStatement.setObject( … , odt ) ;
    

    检索

    OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
    

    这个 java.sql.Date日期 阶级也是可怕的和过时的。

    日期类型 它表示一个时刻(以UTC表示的日期和时间)。因此,这个类只是假装只是日期,而实际上携带了一天中的时间和UTC的隐式偏移量。这引起了很多混乱。永远不要使用这个类。

    java.time.LocalDate文件

    java.time.LocalDate文件

    ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
    LocalDate ld = LocalDate.now( z ) ;    // Capture the current date as seen in the wall-clock time used by the people of a particular region (a time zone).
    

    myPreparedStatement.setObject( … , ld ) ;
    

    检索

    LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
    

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


    关于 java.time文件

    java.time legacy 日期时间类,例如 java.util.Date , Calendar ,& SimpleDateFormat .

    Oracle Tutorial . 和搜索堆栈溢出的许多例子和解释。规格为 JSR 310 .

    Joda-Time 项目,正在进行中 maintenance mode ,建议迁移到 java.time

    你可以交换 对象直接与数据库连接。使用 JDBC driver 符合 JDBC 4.2 java.sql.* 班级。

    Table of which java.time library to use with which version of Java or Android

        6
  •  2
  •   Kent Tong    11 年前

    java中的java.util.Date类表示时间上的特定时刻(例如,2013年11月25日16:30:45到毫秒),但DB中的日期数据类型仅表示日期(例如,2013年11月25日)。为了防止您错误地向DB提供java.util.Date对象,java不允许您直接将SQL参数设置为java.util.Date:

    PreparedStatement st = ...
    java.util.Date d = ...
    st.setDate(1, d); //will not work
    

    PreparedStatement st = ...
    java.util.Date d = ...
    st.setDate(1, new java.sql.Date(d.getTime())); //will work
    

    java.sql.Date对象可以存储时间上的某个时刻(这样就很容易从java.util.Date构造),但是如果您试图请求它几个小时(以强制执行其仅为日期的概念),它将抛出一个异常。DB驱动程序需要识别这个类,并且在几个小时内只使用0。试试这个:

    public static void main(String[] args) {
      java.util.Date d1 = new java.util.Date(12345);//ms since 1970 Jan 1 midnight
      java.sql.Date d2 = new java.sql.Date(12345);
      System.out.println(d1.getHours());
      System.out.println(d2.getHours());
    }
    
        7
  •  0
  •   Abdul Alim Shakir    5 年前

    java.util.Date java.sql.Date , java.sql.Time java.sql.Timestamp 接口。

    java.sql.Date日期 扩展了java.util.Date类,该类表示没有时间信息的日期,并且只应在处理数据库时使用。为了符合SQL DATE的定义,用 必须通过将实例关联的特定时区中的小时、分钟、秒和毫秒设置为零来“规范化”实例。

    日期类型 例如 getHours() , getMinutes() getSeconds() , setHours() setMinutes() setSeconds() . 作为 不存储时间信息,它将覆盖来自的所有时间操作 所有这些方法 java.lang.IllegalArgumentException 如果从它们的实现细节中明显地调用。