簡體   English   中英

如何將字符串類型的日期轉換為日期以進入 Oracle DB - Java

[英]How to Convert String type date to date for entry into oracle DB - Java

傳入日期格式 id 2014-11-03 00.00.00.0,需要轉換為 03/11/2014 或 03-Nov-2014。

什么可能是最好的和最小的代碼?

好的,所以您有一個值為2014-11-03 00.00.00.0String ,並且您想使用 Java 的 JDBC 將該值插入到 Oracle 數據庫表內的DATE字段中?

好吧,首先,使用SimpleDateFormat對象將該String轉換為Date對象:

String s = "2014-11-03 00.00.00.0";
Date d = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss.S").parse(s);

然后,如果您使用的是普通語句,請按照 Oracle 在SQL INSERT命令中接受它的方式重新格式化它,再次使用SimpleDateFormat對象:

String sd = new SimpleDateFormat("dd/MM/yyyy").format(d);

並將其插入您的聲明中:

cn.createStatement().executeUpdate("INSERT INTO TABLE(...) VALUES(" + sd + ");

我建議您更好地使用PreparedStatement而不是普通的SQL INSERT語句,以便對您的語句進行清理:

PreparedStatement ps = cn.prepareStatement("INSERT INTO table VALUES(?, ?, ?)");

然后,將您的日期作為 Date 對象插入,無需格式化為字符串:

ps.setDate([index of the field to insert], d);

如果您使用的是 java 8,則有一個非常有用的日期格式類java.time.format.DateTimeFormatter使用該類,您可以執行以下操作:

LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH.mm.ss");
String text = date.format(formatter);
LocalDate parsedDate = LocalDate.parse(text, formatter);

DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("MM/DD/YYYY");
String newText = parsedDate.format(formatter2);

試試這個代碼:

Date d = new SimpleDateFormat("dd/MM/yyyy").parse(date);

在 java 8 java.util.Date ,從該字符串java.util.Date java.sql.Date (= java.util.Date with zero time) 可能會使用格式化程序,但由於該字符串幾乎是 ISO 標准:

    LocalDateTime x = LocalDateTime.parse("2014-11-03T00:00:00.0");

可以將字符串修補為:

    LocalDateTime t = LocalDateTime.parse("2014-11-03 00.00.00.0"
            .replaceFirst(" ", "T") // Make ISO
            .replaceFirst("\\.", ":")
            .replaceFirst("\\.", ":"));

    java.sql.Date time = java.sql.Date.valueOf(t.toLocalDate());

或者

    LocalDate t = LocalDate.parse("2014-11-03 00.00.00.0"
            .replaceFirst(" .*$", "")); // Remove time part
    java.sql.Date time = java.sql.Date.valueOf(t);

tl;博士

myPreparedStatement.setObject( 
    … , 
    LocalDate.parse(  "2014-11-03 00.00.00.0".substring( 0 , 10 ) ) 
); 

什么可能是最好的和最小的代碼?

你去吧。 但我建議實際上將這么多內容壓縮成一行。 “最好”的代碼很少是“最小的”代碼。

詳情

其他答案都是正確的。 但這里有一些更短的東西。

首先,您不應該將僅日期值作為字符串提交給數據庫。 作為僅限日期的對象提交。 您的JDBC 驅動程序將處理與數據庫通信的細節。

首先通過調用String::substring提取您的日期值。 通過在月和月日填充零,我們知道前 10 位數字是日期。

LocalDate ld = LocalDate.parse(  "2014-11-03 00.00.00.0".substring( 0 , 10 ) );

如果您的 JDBC 驅動程序符合JDBC 4.2或更高版本,您可以直接通過PreparedStatement::setObject傳遞LocalDate

myPreparedStatement.setObject( … , ld );

……或者也許:

myPreparedStatement.setObject( … , ld , JDBCType.DATE );

如果您的驅動程序不符合要求,請轉換為遺留類java.sql.Date 尋找添加到舊類中的新方法。

java.sql.Date sqlDate = java.sql.Date.valueOf( ld );

此處描述的方法假定輸入字符串用於UTC 如果不是,則需要調整為 UTC。 在 Stack Overflow 上搜索有關將字符串解析為ZonedDateTime

這也適用於我。 一個生成日期字符串值的小實用方法,可以插入到 Oracle 數據庫日期字段中,有點臟但有效。 第一個函數使用 Calender 類,第二個使用 LocalDate(Java8 或更高版本)

1.

      /*
     * Format Date for Presentation in format
     * 19-DEC-2019   i.e. Oracle DB DD-MMM-YYYYY
     */
    private String stringToDate(String inputDate) {
        String finalDate = null;
        if (inputDate == null)
            return null;

        try {
            Date parseDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(inputDate);

            // set your local time zone
            Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Africa/Lusaka"));
            cal.setTime(parseDate);
            String finalMonth = "";
            int yearVal = cal.get(Calendar.YEAR);
            int monthVal = cal.get(Calendar.MONTH);  //returns value 0 to 11
            int dayVal = cal.get(Calendar.DAY_OF_MONTH);

            switch(monthVal) {
            case 0:
                finalMonth = "JAN";
                break;
            case 1:
                finalMonth = "FEB";
                break;
            case 2:
                finalMonth = "MAR";
                break;
            case 3:
                finalMonth = "APR";
                break;
            case 4:
                finalMonth = "MAY";
                break;
            case 5:
                finalMonth = "JUN";
                break;
            case 6:
                finalMonth = "JUL";
                break;
            case 7:
                finalMonth = "AUG";
                break;
            case 8:
                finalMonth = "SEP";
                break;
            case 9:
                finalMonth = "OCT";
                break;
            case 10:
                finalMonth = "NOV";
                break;
            case 11:
                finalMonth = "DEC";
                break;

            }

            finalDate = dayVal+"-"+finalMonth+"-"+yearVal;

        } catch (ParseException e) {
            e.printStackTrace();
        }

        return finalDate;
    }

2.

       /*
     * Format Date for Presentation in format
     *  19-DEC-2019   i.e. Oracle DB DD-MMM-YYYYY
     */
    private String stringToDateJava8(String inputDate) {
        String finalDate = null;
        if (inputDate == null)
            return null;

        try {
            Date parseDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(inputDate);

            String finalMonth = "";
            LocalDate localDate = parseDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
            int yearVal  = localDate.getYear();
            int monthVal = localDate.getMonthValue();   //returns value 1 to 12
            int dayVal   = localDate.getDayOfMonth();

            switch(monthVal) {
            case 1:
                finalMonth = "JAN";
                break;
            case 2:
                finalMonth = "FEB";
                break;
            case 3:
                finalMonth = "MAR";
                break;
            case 4:
                finalMonth = "APR";
                break;
            case 5:
                finalMonth = "MAY";
                break;
            case 6:
                finalMonth = "JUN";
                break;
            case 7:
                finalMonth = "JUL";
                break;
            case 8:
                finalMonth = "AUG";
                break;
            case 9:
                finalMonth = "SEP";
                break;
            case 10:
                finalMonth = "OCT";
                break;
            case 11:
                finalMonth = "NOV";
                break;
            case 12:
                finalMonth = "DEC";
                break;

            }

            finalDate = dayVal+"-"+finalMonth+"-"+yearVal;

        } catch (ParseException e) {
            e.printStackTrace();
        }

        return finalDate;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM