【问题标题】:Java convert date to sql timestampJava将日期转换为sql时间戳
【发布时间】:2014-12-03 22:08:34
【问题描述】:

我正在尝试转换从 csv 文件中提取的日期(字符串),将其转换为 sql 时间戳并使用准备好的语句上传。我有的是:

String test = "8/10/2014 16:59";

DateFormat fromFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm");
fromFormat.setLenient(false);
DateFormat toFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSSSSS");
toFormat.setLenient(false);
Date date2 = null;
try {
    date2 = toFormat.parse(test);
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

//java.sql.Timestamp ts2 = java.sql.Timestamp.valueOf(date2);
//java.sql.Timestamp sqlDate2 = new java.sql.Timestamp(timestamp); 
//sql_statement.setTimestamp(1, ts2);

您可以看到我的代码很乱,因为我正在尝试解决这个问题。我总是在 eclipse 中遇到错误:

java.text.ParseException: Unparseable date: "8/10/2014 16:59"
at java.text.DateFormat.parse(DateFormat.java:357)
at      com.syntronic.client.thread.ORCThreadTejasInv.uploadOracleDBOptical(ORCThreadTejasInv.java:555)
at com.syntronic.client.thread.ORCThreadTejasInv.connectOracleDB(ORCThreadTejasInv.java:170)
at com.syntronic.client.thread.ORCThreadTejasInv.retrieveOracleTejas(ORCThreadTejasInv.java:125)
at com.syntronic.client.thread.ORCThreadTejasInv.run(ORCThreadTejasInv.java:84)
at java.lang.Thread.run(Thread.java:745)

我什至尝试使用:

SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" );
String yourformattedDate = sdf.format(test);

出现 diff 错误"

Exception in thread "Thread-6" java.lang.IllegalArgumentException: Cannot format given Object as a Date
at java.text.DateFormat.format(DateFormat.java:301)
at java.text.Format.format(Format.java:157)
at com.syntronic.client.thread.ORCThreadTejasInv.uploadOracleDBOptical(ORCThreadTejasInv.java:562)
at com.syntronic.client.thread.ORCThreadTejasInv.connectOracleDB(ORCThreadTejasInv.java:170)
at com.syntronic.client.thread.ORCThreadTejasInv.retrieveOracleTejas(ORCThreadTejasInv.java:125)
at com.syntronic.client.thread.ORCThreadTejasInv.run(ORCThreadTejasInv.java:84)
at java.lang.Thread.run(Thread.java:745)

任何人都可以帮助解释为什么日期无法解析?以及如何将其转换为正确的 sql 时间戳?谢谢你

【问题讨论】:

  • 为什么你认为你的第一次尝试应该奏效?你是如何解析你的日期的?
  • 您只能用DateFormat#format() 格式化DateNumber 对象,而不是String 对象。

标签: java sql datetime


【解决方案1】:

您的fromFormat 格式说明符是

dd/MM/yyyy hh:mm

但应该是

dd/MM/yyyy HH:mm

并将toFormat 更改为yyyy-MM-dd HH:mm:ss.SSSSSS

那么你的解析代码应该从

date2 = toFormat.parse(test);

date2 = fromFormat.parse(test);
System.out.println(toFormat.format(date2));

我得到了输出

2014-10-08 04:59:00.000000

【讨论】:

    【解决方案2】:

    请使用以下代码,它将满足您的需求

            String test = "8/10/2014 16:59";
            Date date2 = null;
            SimpleDateFormat fromFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm");
    
    
            try
            {
    
                date2 = fromFormat.parse(test);
                Timestamp tt = new Timestamp(date2.getTime());
                System.out.println(tt);
    
            } catch (ParseException ex)
            {
    
                date2 = null;
            } 
    

    【讨论】:

    • “它将满足您的需求” - 只有这句话您值得 +1 :)
    【解决方案3】:

    当您解析如下所示的日期字符串时:

    String test = "8/10/2014 16:59";
    

    您使用的是 24 小时制 (16:59),您应该使用 HH 而不是 hh

    见以下代码sn-p:

        DateFormat fromFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
        fromFormat.setLenient(false);
        Date date2 = null;
        try {
            date2 = fromFormat.parse(test);
            System.out.println("date2 = " + date2);  // prints date2 = Wed Oct 08 16:59:00 PDT 2014          
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    

    【讨论】:

    • 您可以使用d/M/y H:M 并得到相同的结果,数字标记与解析无关,它们仅用于格式化...
    • @MadProgrammer 不正确:尝试运行我在答案中提供的代码 sn-p,格式为 d/M/y H:M,你会得到一个 ParseException
    • 输入8/10/2014 16:59,格式d/M/y H:m,输出date2 = Wed Oct 08 16:59:00 EST 2014 ...
    • @MadProgrammer 我不得不承认我没有在 Java 7 上测试它,但在 Java 8 上它失败了:"java.text.ParseException: Unparseable date: "08/10/2014 16:59" at java.text.DateFormat.parse"
    • @MadProgrammer 您发布的第一个示例失败,因为您使用了M 而不是m(分钟)。使用d/M/y H:m 也适用于我。无论如何,谢谢 - 采取点,我会恭敬地解决答案。
    【解决方案4】:

    所以你有一个String,并且你想将它解析为一个Date...让我们看看这个例子是否对你有帮助:

    import java.util.Date;
    import java.text.SimpleDateFormat;
    import java.text.ParseException;
    
    public class DateConverter
    {
        public static void main(String[] args) {
            String test = "8/10/2014 16:59";
            SimpleDateFormat sdf1 = new SimpleDateFormat("d/MM/yyyy HH:mm"),
                             sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            /*
             'sdf1' will be used to parse your input string as a date
             'sdf2' will be used to output a string with your desired date format
             */
            Date d;
            String formatted_date;
            try {
                // Parse the string to a date, using the defined format
                d = sdf1.parse(test);
                // Now, format the date with 'sdf2' and store it in a string
                formatted_date = sdf2.format(d);
                System.out.println(formatted_date); // The output is: 2014-10-08 16:59:00
            } catch(ParseException e) {
                System.err.println(e.getMessage());
                e.printStackTrace(System.err);
            }
        }
    }
    

    【讨论】:

      【解决方案5】:

      能够使用以下代码修复它:

      DateFormat fromFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
      Date date2 = null;
      String def = perRow[cnt].replaceAll("8", "08");
      try {
          date2 = fromFormat.parse(def);
      } catch (ParseException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
      
      long tsTime1 = date2.getTime();
      
      java.sql.Timestamp sqlDate2 = new java.sql.Timestamp(tsTime1); 
      sql_statement.setTimestamp(2, sqlDate2);
      

      当然,我不知道这是否是正确或更合适的方法:
      1. 用正确的日期 'dd' 替换 sting
      2. 解析为日期格式
      3. 转长
      4.转换为sql日期

      任何人都知道更好的方法或想法,线程对 cme​​ts 开放。谢谢。

      【讨论】:

      • 为什么?您可以使用d/M/y H:m 的格式,它会成功解析8/10/2014 16:59。主要问题是没有使用H...简单修复,不需要用replaceAll...
      【解决方案6】:

      您可以使用java.sql.Timestamp 对其进行转换。这是一个sn-p:

          String strDate = "15/07/1989 15:30";
          SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm");
          Date date = format.parse(strDate);
          System.out.println(date);
          java.sql.Timestamp timestamp = new java.sql.Timestamp(date.getTime());
          System.out.println(timestamp);
      

      输出将是:

      Sat Jul 15 15:30:00 IST 1989
      1989-07-15 15:30:00.0
      

      【讨论】:

        【解决方案7】:

        简单!

        首先解析 fromDate 然后格式化为 toDate 模式。

        toFormat.format(fromFormat.parse(test));
        

        【讨论】:

          猜你喜欢
          • 2014-05-16
          • 1970-01-01
          • 2017-12-12
          • 2017-04-06
          • 1970-01-01
          • 2016-11-26
          • 2016-06-07
          • 2018-06-26
          • 1970-01-01
          相关资源
          最近更新 更多