Преобразование даты в java

177
13 сентября 2019, 12:40

Проблема такая: Нужно внести в базу данных дату и время в соответствующие поля. Но происходит непонятная ситуация. На уровне выполнения запроса происходит преобразования даты и времени. Закономерности преобразования времени я не выявил. С датой же от вносимой на день назад. Использую MySQL, java.sql.Date и Time.

Код, выполняющий запрос к базе данных.

@Override
    public int addNewSaleSum(SaleSum new_sale_sum) {
        int id_sale = 0;
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        String sql = "INSERT INTO esteamerbase.sale_sum " +
                "(ID_CARD, ID_USER, BUY_SUM, CASHBEK_SUM, GIFT_SUM, DATE_BUY, TIME_BUY,COMMENT, SPOSOB_OPLAT) " +
                "VALUES (?,?,?,?,?,?,?,?,?)";
        try {
            connection = getConnection();
            preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            preparedStatement.setInt(1, new_sale_sum.getId_card());
            preparedStatement.setInt(2, new_sale_sum.getId_user());
            preparedStatement.setFloat(3, new_sale_sum.getBuy_sum());
            preparedStatement.setFloat(4, new_sale_sum.getCashbek_sum());
            preparedStatement.setFloat(5, new_sale_sum.getGift_sum());
            preparedStatement.setDate(6, new_sale_sum.getDate_byu());//Преобразование происходит тут
            preparedStatement.setTime(7, new_sale_sum.getTime_buy());Преобразование происходит тут
            preparedStatement.setString(8, new_sale_sum.getComment());
            preparedStatement.setString(9, new_sale_sum.getSposob_oplat());
            preparedStatement.executeUpdate();
            resultSet = preparedStatement.getGeneratedKeys();
            while (resultSet.next()){
                id_sale = resultSet.getInt(1);
            }
        }catch (SQLException e){
            try{
                File file = new File("E:/1.txt");
                file.getParentFile().mkdirs();
                PrintWriter printWriter = new PrintWriter(file.getAbsoluteFile());
            try {
                e.printStackTrace(printWriter);
            }finally {
                printWriter.close();
            }
            }catch (IOException ex){
                ex.printStackTrace();
            }
        }finally {
            closeConnection(connection);
            closePreparedStatement(preparedStatement);
            closeResultSet(resultSet);
        }
    return id_sale;
}

Подключение к базе данных

db.host = jdbc:mysql://localhost:3306/esteamerbase?useLegacyDatetimeCode=false&amp&serverTimezone=UTC

Метод формирующий текущую дату и приводящий его к типу sql Date

public Date getNowDateToDate(){
    String date = "";
    Calendar calendar = Calendar.getInstance();
    date += calendar.get(Calendar.YEAR)+"-";
    if ((calendar.get(Calendar.MONTH)+1)<10){
        date += "0" + (calendar.get(Calendar.MONTH)+1);
    }else {
        date += (calendar.get(Calendar.MONTH)+1);
    }
    if (calendar.get(Calendar.DAY_OF_MONTH)<10){
        date += "-0" + calendar.get(Calendar.DAY_OF_MONTH);
    }else{
        date += "-" + calendar.get(Calendar.DAY_OF_MONTH);
    }
    return Date.valueOf(date);
}

Суть в том, что я отправляю на запись в Базу данных 2019-02-01, а мне записывается 2019-01-31. Если в код генерирования текущей даты ко дню добавить +1 (2019-02-02), то в Базу записывается 2019-02-01. Но это не выход. Со временен разница в 3 часа. Глобальный часовой пояс в MySql настроен на SYSTEM.
Как решить проблему?

Answer 1

Разобрался в чем была проблема. Проблема была в timezone в СУБД MySQL. Как только установил глобальную зону на +3 часа все сразу стало корректно отрабатывать.

Answer 2

Попробуйте передать дату не в привычном формате а в unixTime.

long data = System.currentTimeMillis();  

или

int data2 = (int) (System.currentTimeMillis())/1000;  

или

int data3 = (int) (System.currentTimeMillis())/1000/60/24;

Если будет разрыв в будет в несколько часов значит вы на верном пути. Пробуйте один из этих вариантов. У меня была идентичная проблема, помог вариант2 но мне надо было дата+время.

READ ALSO
Проблема с парсингом xml на linux

Проблема с парсингом xml на linux

Мне необходимо распарсить xml, который содержит русские буквыОн лежит в postgresql базе

144
Не могу сделать импорт

Не могу сделать импорт

У меня на данный момент вот такое дерево

148
Кнопка Иконка + Текст

Кнопка Иконка + Текст

Подскажите, пожалуйста, как реализовать кнопку такого вида?

119
Замена строки в таблицу MySql из приложения

Замена строки в таблицу MySql из приложения

подскажите пожалуйста как я могу обратиться из андроид программы к базе данных MySql на сервере и заменить данные в таблицы tbl_menu в столбце price на другие

150