【问题标题】:Formatting Date on Java在 Java 上格式化日期
【发布时间】:2010-12-28 00:18:09
【问题描述】:

我有一个格式如下的字符串:january_2005 (MMMMMMM_yyyy)

我想将其转换为 mysql 可接受的日期值以将其插入数据库。

我需要在 Java 上完成。

有人知道怎么做吗?

谢谢

【问题讨论】:

    标签: java mysql date


    【解决方案1】:

    创建您自己的 Dateformatter...并使用您自己的 Date Format 来解决此类问题。

    DateFormatter

    DateFormat

    如果出现有关日期格式的错误,请编辑您的问题:-)

    【讨论】:

      【解决方案2】:

      您可以像这样使用SimpleDateFormat 来获得Date 对象:

      DateFormat formatter = new SimpleDateFormat("MMMM_yyyy");
      Date date = (Date)formatter.parse("January_2009");
      

      您可能需要将 'january' 的第一个字母大写才能使其正常工作(我不确定 SimpleDateFormat 接受的输入范围。

      获得Date 后,接下来要做什么取决于您在 MySQL 中如何存储日期。

      【讨论】:

        【解决方案3】:

        我认为这样的事情会使用准备好的语句来完成

        DateFormat formatter = new SimpleDateFormat("MMMMMMM_yyyy");
        Date mydate = formatter.parse("january_2005");
        stmt_date.setTimestamp(4, new Timestamp(mydate.getTime()));
        

        【讨论】:

          【解决方案4】:

          这样的事情可能会奏效,

          SimpleDateFormat myFormat = new SimpleDateFormat("MMMM_yyyy");
          Date aDate;
          try 
          {
              aDate = myFormat.parse("January_2009");
          } 
          catch (ParseException e) 
          {
              // Error handling
          }
          

          然后您可以使用 PreparedStatement 将aDate 插入到您的数据库中。

          如果您不使用 PreparedStatements 而是需要将其作为字符串,那么您可以执行以下操作。尽管如 cmets 中所述,使用 PreparedStatements 插入数据库要安全得多。

          SimpleDateFormat sqlFormat = new SimpleDateFormat("yyyy-MM-dd hh:dd:ss");
          String sqlDateString = aDate.format(sqlFormat);
          

          【讨论】:

          • 使用 SQL 将日期插入数据库的字符串非常糟糕。您应该始终使用 PreparedStatements。
          • 同意。但问题只是问如何将其转换为可接受的值,而不是如何将其插入数据库。这就是为什么我在最后提供了转换为字符串的选项。不过,我会更新我的答案以使这一点更清楚,因为你说得对,这是不好的做法。
          【解决方案5】:

          首先使用SimpleDateFormat将日期解析为Date对象:

           Date d=  new SimpleDateFormat("MMMM_yyyy").parse(s)
          

          然后使用参数化 SQL(PreparedStatement)插入日期:

          public insertData(Date d) {
             Connection conn = setupTheDatabaseConnectionSomehow();
             PreparedStatement stmt = 
               conn.prepareStatement("INSERT INTO t (date) values (?)");
             stmt.setDate(2, new java.sql.Date(d));
             stmt.executeUpdate();
          }
          

          问号将自动转换为 MySQL 的正确格式,并使您的代码更安全、更便携。搜索parameterised SQL 了解更多信息。

          【讨论】:

            【解决方案6】:

            根据SimpleDateFormat API,模式实际上是MMMM_yyyy

            因此,要从 String 中获得有价值的 java.util.Date,您需要这样做:

            String stringDate = "january_2005";
            Date date = new SimpleDateFormat("MMMM_yyyy").parse(stringDate);
            

            如果这些月份预计始终是英语,并且运行它的机器的 Locale 不是(总是)英语,那么您最好还需要指定 Locale

            Date date = new SimpleDateFormat("MMMM_yyyy", new Locale("en")).parse(stringDate);
            

            要将其保存在数据库中,请使用PreparedStatement#setDate()。您需要先将java.util.Date 转换为java.sql.Date

            preparedStatement = connection.prepareStatement("INSERT INTO mytable (somedate) VALUES (?)";
            preparedStatement.setDate(1, new java.sql.Date(date.getTime()));
            

            【讨论】:

            • 令人惊讶的是有多少人忘记了Locale 的重要性。没有一个答案提到Locale。在非英语机器中,您将在 january 上获得 ParseException,否则。
            【解决方案7】:

            此处建议 SimpleDateFormat 的答案在很大程度上看起来不错。但是,为了(可能)使问题复杂化,请注意 SimpleDateFormat 不是线程安全的。如果这对您来说是一个潜在问题,请查看 Joda 时间库,它具有类似的格式化类,但具有线程安全保证。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多