【问题标题】:Java date formatting for SQLSQL 的 Java 日期格式
【发布时间】:2014-04-18 13:02:26
【问题描述】:

我有一个我构造的日期对象:

    Calendar cal = new GregorianCalendar();
    cal.set(2013, 12, 1, 0, 0, 0);
    Date begin = new Date(cal.getTimeInMillis());

我正在尝试在查询中使用它,并且我知道查询采用如下格式:2008-10-29 14:56:59

当我打印我的日期时,它看起来像:Wed Jan 01 00:00:00 EST 2014

我的问题:

如何将日期格式从Wed Jan 01 00:00:00 EST 2014 转换为2008-10-29 14:56:59

【问题讨论】:

  • 感谢链接,正在阅读。那么"yyyy-MM-dd HH:mm:ss" 会成功吗?
  • 是的,它会将日期转换为您想要的格式。
  • @guilhebl 或者直接使用带有 JDBC 的java.sql.Timestamp
  • @MarkRotteveel 所说的。无论你的 JDBC 接口如何,你都应该将变量绑定到固定的 sql 语句,而不是连接字符串 - 否则你只是要求一个 sql 注入漏洞。

标签: java sql date


【解决方案1】:

这应该会有所帮助:

Calendar cal = new GregorianCalendar();
cal.set(2013, 11, 1, 0, 0, 0);
DateFormat dateFormat;
dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(dateFormat.format(new Date(cal.getTimeInMillis())));
  • 11 月 11 日

【讨论】:

  • 感谢您对 12 月的额外评论。
【解决方案2】:

您可以使用 simpleDateFormat 类。我在下面给出了一个简单的例子。

这里你必须提供你需要的日期格式,日期对象。

SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String date =null;    
date = dateformat.format(begin);
System.out.println(date);

【讨论】:

    【解决方案3】:

    用它来获得你想要的格式

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    String dateInString = "pass you date string here";
    Date date = sdf.parse(dateInString);
    

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      与数据库通信时使用对象而不是字符串。对于日期时间值,请使用日期时间对象。

      java.time

      避免使用麻烦的旧日期时间类,包括 CalendarGregorianCalendar。它们设计不良、有缺陷且令人困惑。他们的麻烦之一是 toString 方法在生成字符串时动态应用 JVM 的当前默认时区,这本来是有用的,但结果却是一个反特性。

      改为使用现代 java.time 类。

      如果您的JDBC driver 更新为JDBC 4.2later,请直接使用java.time 类型而不是java.sql 类型。

      更改您的输入字符串以符合 ISO 8601 格式。将中间的空格更改为T

      String input = "2008-10-29 14:56:59".replace( " " , "T" ) ;
      

      解析为LocalDateTime,因为您的输入缺少任何时区指示或与UTC 的偏移量。

      LocalDateTime ldt = LocalDateTime.parse( input ) ;
      

      或者将日期时间值指定为整数。

      LocalDateTime ldt = LocalDateTime.of( 2013 , 12 , 1 , 0 , 0 , 0 , 0 ) ;
      

      如果您的数据库列的类型为TIMESTAMP WITHOUT TIME ZONE,您就可以进行查询了。请确保您了解,如果没有时区的上下文或与 UTC 的偏移,这些值代表特定时刻,并且不是时间轴上的一个点,而是关于可能的时刻的模糊想法。

      String sql = "SELECT * FROM tbl_ WHERE when_ >= ? ; " ; 
      PreparedStatement ps = conn.prepareStatement( sql ) ;
      ps.setObject( 1 , ldt ) ;  // Call `setObject` to pass a java.time object directly without converting into `java.sql.*` type.
      ResultSet resultSet = ps.executeQuery() ;
      …
      LocalDateTime ldt = resultSet.getObject( … , LocalDateTime.class ) ;
      

      如果您打算跟踪实际时刻、时间线上的特定点,那么您将使用 TIMESTAMP WITH TIME ZONE 作为您的数据库列类型,并使用 InstantZonedDateTime java.time 类。

      【讨论】:

        猜你喜欢
        • 2010-11-03
        • 2011-06-22
        • 2013-01-21
        • 1970-01-01
        • 2010-09-29
        • 2011-11-16
        • 1970-01-01
        相关资源
        最近更新 更多