Проблема такая: Нужно внести в базу данных дату и время в соответствующие поля. Но происходит непонятная ситуация. На уровне выполнения запроса происходит преобразования даты и времени. Закономерности преобразования времени я не выявил. С датой же от вносимой на день назад. Использую 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&&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.
Как решить проблему?
Разобрался в чем была проблема. Проблема была в timezone в СУБД MySQL. Как только установил глобальную зону на +3 часа все сразу стало корректно отрабатывать.
Попробуйте передать дату не в привычном формате а в unixTime.
long data = System.currentTimeMillis();
или
int data2 = (int) (System.currentTimeMillis())/1000;
или
int data3 = (int) (System.currentTimeMillis())/1000/60/24;
Если будет разрыв в будет в несколько часов значит вы на верном пути. Пробуйте один из этих вариантов. У меня была идентичная проблема, помог вариант2 но мне надо было дата+время.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Мне необходимо распарсить xml, который содержит русские буквыОн лежит в postgresql базе
подскажите пожалуйста как я могу обратиться из андроид программы к базе данных MySql на сервере и заменить данные в таблицы tbl_menu в столбце price на другие