преобразование строковой даты в sql формат даты в java - PullRequest
0 голосов
/ 25 сентября 2018

Я хотел бы достичь ниже:

У меня есть дата в строковом формате, например, "2015-05-12 15:15:24", я хотел бы преобразовать ее в sql дату в формате "дд-МММ-уу».Однако это не работает.ниже приведен фрагмент кода:

    String rawDate="2015-05-12 15:15:24";

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date =format.parse(rawDate);
    Date sqlDate = new java.sql.Date(date.getTime());

    SimpleDateFormat changedFormat = new SimpleDateFormat("dd-MMM-yy");
    Date date2=changedFormat.parse(changedFormat.format(sqlDate));
    Date sqlDate2 = new java.sql.Date(date2.getTime());

    System.out.println("sqlDate : "+sqlDate +"  ::::::   Date2 : "+date2+"  :::: sqlDate2  "+sqlDate2);ow here is the Test : "+sqlDate2);

Вывод программы:

sqlDate: 2015-05-12 :::::: Date2: Tue 12 May 00:00:00 BST 2015 :::: sqlDate2 2015-05-12

Целью было получить дату в формате java.sql с 12 мая по 15 мая, но май не переводится в алфавитный месяц, а скореенапечатано как число.

Я что-то упустил.любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

В вашем коде есть дата в нужном формате, но вы вводите дату другого типа объекта.

измените это:

Date date2=changedFormat.parse(changedFormat.format(sqlDate));
Date sqlDate2 = new java.sql.Date(date2.getTime());

на это: String dateformat =(changedFormat.format(sqlDate));

вы можете передать значение из строки yo вашей даты объекта.но если вы печатаете переменную дату, которую вы не печатаете в нужном вам формате, это может произойти:

Дата не сохраняет в себе никакого формата.

0 голосов
/ 25 сентября 2018

tl; dr

Использование объектов, а не строк, для связи с базой данных.

Использование только java.time классов, никогда java.util.Date, Calendarили java.sql.Date классов.

myPreparedStatement.setObject(                      // Use smart objects, not dumb strings.
    … ,                                             // Specify which placeholder `?` in you SQL.
    LocalDateTime.parse(                            // Parse input string lacking any zone or offset as a `LocalDateTime` object. *NOT* a moment, just a vague idea about *potential* moments.
        "2015-05-12 15:15:24".replace( " " , "T" )  // Alter your input string to comply with ISO 8601 standard format, with `T` in the middle.
    )                                               // Returns a `LocalDateTime` object.
    .atOffset(                                      // Apply an offset-from-UTC to determine a moment, a specific point on the timeline.
        ZoneOffset.UTC                              // Apply UTC if the input string was intended to be a moment in UTC.
    )                                               // Returns a `OffsetDateTime` object.
    .toLocalDate()                                  // Extract a date-only value, a `LocalDate` object from the date-with-time `OffsetDateTime` object.
)

Подробности

преобразовать его в дату sql в формате "dd-MMM-yy"

Нет такого стандартного формата SQL.Стандартный формат SQL для даты аналогичен стандартному формату ISO 8601: ГГГГ-ММ-ДД.

java.time

Вы используете ужасные старые классы, которые были вытеснены несколько лет назадсовременные java.time классы.

LocalDateTime

В вашей входной строке отсутствует индикатор часового пояса или смещения от UTC.Поэтому анализируйте как LocalDateTime.

. Классы java.time по умолчанию используют стандартный формат ISO 8601 при разборе и генерации строк.Ваша входная строка почти соответствует стандарту.Просто замените ПРОБЕЛ в середине на T.

String input =  "2015-05-12 15:15:24".replace( " " , "T" ) ;

Parse.

LocalDateTime ldt = LocalDateTime.parse( input ) ;

OffsetDateTime

A LocalDateTime не не представляет момент.Он представляет потенциальных моментов на протяжении 26-27 часов, часовых поясов по всему земному шару.Если вы знаете предполагаемый часовой пояс, примените ZoneId, чтобы получить ZonedDateTime объект.Если вам известно только простое смещение, а не зона, примените ZoneOffset, чтобы получить OffsetDateTime объект.Я предполагаю, что ваше значение предназначено для представления момента в формате UTC, другими словами, смещение от UTC, равное нулю.

OffsetDateTime odt = ldt.atOffset( Offset.UTC ) ;

Смарт-объекты, а не тупые строки

Вы должныиспользуйте типы классов, соответствующие вашим типам данных SQL, для обмена данными с вашей базой данных.Используйте смарт-объекты, а не тупые строки.

Начиная с JDBC 4.2 мы можем напрямую обмениваться java.time объектами.

myPreparedStatement.setObject( … , odt ) ;

Извлечение.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

LocalDate

Вы заботитесь только о дате, а не о времени суток.Поэтому извлеките LocalDate объект.

LocalDate ld = odt.toLocalDate() ;

Отправьте в свою базу данных.

myPreparedStatement.setObject( … , ld ) ;

Извлечение.

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

Полный пример

Вот полный пример приложения, в одном .java.

Использование H2 Database Engine .Мы указываем базу данных в памяти, которая никогда не сохраняется в хранилище, так как это всего лишь демонстрационная версия.

package com.basilbourque.example;

import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.UUID;

public class DateIntoDatabase {

    public static void main ( String[] args ) {
        DateIntoDatabase app = new DateIntoDatabase();
        app.doIt();
    }

    private void doIt () {
        try {
            Class.forName( "org.h2.Driver" );
        } catch ( ClassNotFoundException e ) {
            e.printStackTrace();
        }

        try (
        Connection conn = DriverManager.getConnection( "jdbc:h2:mem:date_into_db_example_" ) ;
        Statement stmt = conn.createStatement() ;
        ) {
            String sql = "CREATE TABLE event_ (\n" +
            "  id_ UUID DEFAULT random_uuid() PRIMARY KEY ,\n" +
            "  name_ VARCHAR NOT NULL ,\n" +
            "  when_ DATE NOT NULL\n" +
            ") ; ";
            System.out.println( sql );
            stmt.execute( sql );

            // Insert row.
            sql = "INSERT INTO event_ ( name_ , when_ ) " + "VALUES ( ? , ? ) ;";
            try ( PreparedStatement preparedStatement = conn.prepareStatement( sql ) ; ) {
                String name = "whatever";
                LocalDate ld = LocalDateTime.parse( "2015-05-12 15:15:24".replace( " " , "T" ) ).atOffset( ZoneOffset.UTC ).toLocalDate();

                preparedStatement.setString( 1 , name );
                preparedStatement.setObject( 2 , ld );
                preparedStatement.executeUpdate();
            }

            // Query all.
            sql = "SELECT * FROM event_ ;";
            try ( ResultSet rs = stmt.executeQuery( sql ) ; ) {
                while ( rs.next() ) {
                    //Retrieve by column name
                    UUID id = ( UUID ) rs.getObject( "id_" );  // Cast the `Object` object to UUID if your driver does not support JDBC 4.2 and its ability to pass the expected return type for type-safety.
                    String name = rs.getString( "name_" );
                    LocalDate ld = rs.getObject( "when_" , LocalDate.class );

                    //Display values
                    System.out.println( "id: " + id + " | name: " + name + " | when: " + ld );
                }
            }
        } catch ( SQLException e ) {
            e.printStackTrace();
        }
    }
}

При запуске:

id: 0a4fd38c-7d4e-4049-bc21-e349582c8bc5 |имя: что угодно |когда: 2015-05-12


О java.time

java.time Фреймворк встроен в Java 8 и выше.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздних версий - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесены в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 25 сентября 2018

Вы вычислили его, но никогда не печатали:

String rawDate = "2015-05-12 15:15:24";

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(rawDate);
java.sql.Date sqlDate = new java.sql.Date(date.getTime());

SimpleDateFormat changedFormat = new SimpleDateFormat("dd-MMM-yy");
System.out.println("Formatted Date: " + changedFormat.format(sqlDate));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...