【问题标题】:Get the current date in java.sql.Date format以 java.sql.Date 格式获取当前日期
【发布时间】:2013-08-17 22:26:53
【问题描述】:

我需要将当前日期添加到 JDBC 调用的准备好的语句中。我需要以yyyy/MM/dd 之类的格式添加日期。

我试过了

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
Date date = new Date();
pstm.setDate(6, (java.sql.Date) date);

但我有这个错误:

threw exception
java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date

有没有办法获得一个相同格式的java.sql.Date对象?

【问题讨论】:

  • 根据您的用例,您可能不想从客户端发送日期。相反,在表上有一个插入触发器以在数据库服务器端将列设置为“现在”。这样,您可以拥有一致的服务器端时间戳,保护自己免受客户端时钟/时区问题的影响,并且如果新记录是从不同的客户端应用程序或临时事务插入的,那么新记录的日期仍然会更新。

标签: java jdbc java.util.date


【解决方案1】:

由于 java.sql.Date 有一个需要“长时间”的构造函数,而 java.util.Date 有一个返回“长时间”的方法,我只是将返回的“长时间”传递给 java.sql。 Date 创建日期。

java.util.Date date = new java.util.Date();
java.sql.Date sqlDate = new Date(date.getTime());

【讨论】:

    【解决方案2】:

    为了获得“当前日期”(如今天的日期),您可以使用LocalDate.now() 并将其传递给java.sql.Date 方法valueOf(LocalDate)。

    import java.sql.Date;
    ...
    Date date = Date.valueOf(LocalDate.now());
    

    【讨论】:

      【解决方案3】:

      这些都太长了。

      只需使用:

      new Date(System.currentTimeMillis())
      

      【讨论】:

      • 我怎样才能把它变成这种格式 2020-05-27T16:28:15.759+0200 而不是 2020-05-27 ?谢谢
      • 如果您想要一个偏移量,您可能需要使用 OffsetDateTime 类并将其作为字符串保存。但是,请注意,偏移量会影响夏令时。
      【解决方案4】:

      会做: new Date(Instant.now().toEpochMilli())

      【讨论】:

        【解决方案5】:

        tl;博士

        myPreparedStatement.setObject(   // Directly exchange java.time objects with database without the troublesome old java.sql.* classes.
            … ,                                   
            LocalDate.parse(             // Parse string as a `LocalDate` date-only value.
                "2018-01-23"             // Input string that complies with standard ISO 8601 formatting.
            ) 
        )
        

        java.time

        现代方法使用 java.time 类来取代麻烦的旧遗留类,例如 java.util.Date 和 java.sql.Date。

        对于仅日期值,请使用 LocalDate。 LocalDate 类表示没有时间和时区的仅日期值。

        java.time 类在解析/生成字符串时使用标准格式。所以不需要指定格式模式。

        LocalDate ld = LocalDate.parse( input ) ;
        

        您可以使用符合JDBC 4.2 或更高版本的JDBC driver 直接与您的数据库交换java.time 对象。您可以忘记转换入和出 java.sql.* 类。

        myPreparedStatement.setObject( … , ld ) ;
        

        检索:

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

        关于java.time

        java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。

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

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

        从哪里获得 java.time 类?

        ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。

        【讨论】:

          【解决方案6】:

          你要做的就是这个

              Calendar currenttime = Calendar.getInstance();               //creates the Calendar object of the current time
              Date sqldate = new Date((currenttime.getTime()).getTime());  //creates the sql Date of the above created object
              pstm.setDate(6, (java.sql.Date) date);              //assign it to the prepared statement (pstm in this case)
          

          【讨论】:

            【解决方案7】:

            您可以通过以下方式实现您的目标:-

            long millis=System.currentTimeMillis();  
            java.sql.Date date=new java.sql.Date(millis);  
            

            或

            // create a java calendar instance
            Calendar calendar = Calendar.getInstance();
            
            // get a java date (java.util.Date) from the Calendar instance.
            // this java date will represent the current date, or "now".
            java.util.Date currentDate = calendar.getTime();
            
            // now, create a java.sql.Date from the java.util.Date
            java.sql.Date date = new java.sql.Date(currentDate.getTime());
            

            【讨论】:

              【解决方案8】:
              new java.sql.Date(Calendar.getInstance().getTimeInMillis());
              

              【讨论】:

                【解决方案9】:

                只需一行:

                java.sql.Date date = new java.sql.Date(Calendar.getInstance().getTime().getTime());
                

                【讨论】:

                • 为什么总是给我午夜时间而不是当前时间?
                • 你需要的时间java.sql.Time time = new java.sql.Time(Calendar.getInstance().getTime().getTime());
                【解决方案10】:

                java.util.Date 不是java.sql.Date。这是相反的方式。 java.sql.Date 是 java.util.Date。

                您需要使用constructor that takes a long 可以提供的java.sql.Date 将其转换为java.sql.Date。

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

                【讨论】:

                • @Yster 问题已经有了当前日期:Date date = new Date();。这是关于将java.util.Date 转换为java.sql.Date。
                • 为简单起见:java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
                • downvote - 不知道 utilDate 是什么或者你的代码是如何编译的。不清楚。
                • @bharal 命名约定很明显是“sqlDate”和“utilDate”(java.sql.Date,java.util.Date)。代码在其中存在名称为“utilDate”的java.util.Date 的任何块中编译。问题是关于转换日期,暗示一个已经存在。
                • @AhmedElbatt 但答案仍然有效。问题询问如何将一个类转换为另一个类。
                猜你喜欢
                • 2011-12-06
                • 2017-11-18
                • 2016-05-29
                • 2017-06-18
                • 2015-06-07
                • 2021-04-03
                • 2016-05-25
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多