|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Mar 2019
Messaggi: 14
|
MySQL - Data sul DB diminuita di un giorno
Ciao a tutti.
Ho il seguente problema: Sto facendo una java web application molto semplice in cui memorizzo nel database i dati relativi a una persona: nome, cognome e data di nascita. L'applicazione sembra funzionare tranne per il fatto che, inserendo una data (ad esempio 07/03/2019) mi ritrovo sul db tale data diminuita di un giorno, ovvero 2019-03-06. Com'è possibile? Potreste dirmi come fixare tale problema? Di seguito il codice: Il bean Codice HTML:
package bean;
import java.io.Serializable;
import java.sql.Date;
public class Persona implements Serializable {
private int idPersona;
private String nome;
private String cognome;
private Date dataNascita;
public Persona() {
super();
}
public Persona(String nome, String cognome, Date dataNascita) {
super();
this.nome = nome;
this.cognome = cognome;
this.dataNascita = dataNascita;
}
public Persona(int idPersona, String nome, String cognome, Date dataNascita) {
super();
this.idPersona = idPersona;
this.nome = nome;
this.cognome = cognome;
this.dataNascita = dataNascita;
}
public int getIdPersona() {
return idPersona;
}
public void setIdPersona(int idPersona) {
this.idPersona = idPersona;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCognome() {
return cognome;
}
public void setCognome(String cognome) {
this.cognome = cognome;
}
public Date getDataNascita() {
return dataNascita;
}
public void setDataNascita(Date dataNascita) {
this.dataNascita = dataNascita;
}
}
Codice HTML:
package servlet;
import java.io.IOException;
import java.sql.Date;
import java.sql.SQLException;
import java.text.ParseException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.Persona;
import dao.ProvaDao;
import utility.ManipolazioneDate;
/**
* Servlet implementation class Inserimento
*/
@WebServlet("/Inserimento")
public class Inserimento extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* Default constructor.
*/
public Inserimento() {
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String nome = request.getParameter("nome");
String cognome = request.getParameter("cognome");
String dataNascita = request.getParameter("dataNascita");
Date dataN = null;
try {
dataN = (Date) ManipolazioneDate.convertiData(dataNascita);
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Persona p = new Persona(nome, cognome, dataN);
System.out.println(p.getNome());
System.out.println(p.getCognome());
System.out.println(p.getDataNascita());
try{
ProvaDao.registraPersona(p);
}catch(SQLException e){
e.printStackTrace();
}
}
}
Codice HTML:
package utility;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ManipolazioneDate {
public static Date convertiData(String data) throws ParseException{
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date parser = format.parse(data);
java.sql.Date dataSql = new java.sql.Date(parser.getTime());
return dataSql;
}
}
Codice HTML:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <div align="center"> <form action="/Prova/Inserimento" method="get"> <p>Nome</p> <input type="text" value="" name="nome"> <br> <p>Cognome</p> <input type="text" value"" name="cognome"> <br> <p>Data di nascita</p> <input type="text" value="" name="dataNascita"> <br> <input type="submit" value="Invia"> </form> </div> </body> </html> [html] package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import bean.Persona; import utility.Connessione; public class ProvaDao { public static void registraPersona(Persona persona) throws SQLException{ Connection conn = Connessione.getConnection(); PreparedStatement ps = null; String ins = "insert into prova2.persona(nome, cognome, dataNascita) values(?,?,?)"; try{ ps = conn.prepareStatement(ins); ps.setString(1, persona.getNome()); ps.setString(2, persona.getCognome()); ps.setDate(3, persona.getDataNascita()); ps.executeUpdate(); System.out.println("Persona inserita"); }catch(SQLException e){ System.out.println(e.getMessage()); System.out.println("Errore nell'inserimento"); }finally{ if(ps != null){ ps.close(); } if(conn != null){ conn.close(); } } } } [html] Ultima modifica di Andreawave : 07-03-2019 alle 01:15. Motivo: Mancato inserimento del codice del Dao |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2005
Messaggi: 3290
|
La butto li ma non sono sicuro.
Non è che hai definito la colonna datanascita come datetime e timestamp? In quel caso mi verrebbe da pensare che ci sia un problema derivato dalla timezone (ad esempio se fosse un datetime e metti il 6 marzo 2019, mysql lo rappresenta in 2019-03-06 00:00:00 UTC+1 e quando vai a convertirlo risulta 2019-03-05 23:00:00 ). E' un ipotesi, dovresti debuggare a livello di inserimento in mysql |
|
|
|
|
|
#3 | |
|
Junior Member
Iscritto dal: Mar 2019
Messaggi: 14
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2005
Messaggi: 3290
|
|
|
|
|
|
|
#5 | |
|
Junior Member
Iscritto dal: Mar 2019
Messaggi: 14
|
Quote:
In pratica la data che ho inserito rimane invariata. Cambia(diminuisce) solo verificando nel db. Tu pensi quindi di utilizzare datetime e non date sul db? Ultima modifica di Andreawave : 07-03-2019 alle 15:39. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2005
Messaggi: 3290
|
Quote:
Ma hai verificato la configurazione cosa dice sul timezone? |
|
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Mar 2019
Messaggi: 14
|
Ok ora provo..
Ultima modifica di Andreawave : 07-03-2019 alle 18:04. |
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Mar 2019
Messaggi: 14
|
Ok, ho provato ma ottengo lo stesso identico risultato, con la differenza che, usando datetime ottengo pure l'orario in formato HH:MM:SS
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2005
Messaggi: 3290
|
|
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: Mar 2019
Messaggi: 14
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2005
Messaggi: 3290
|
|
|
|
|
|
|
#12 |
|
Junior Member
Iscritto dal: Mar 2019
Messaggi: 14
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2005
Messaggi: 3290
|
|
|
|
|
|
|
#14 |
|
Junior Member
Iscritto dal: Mar 2019
Messaggi: 14
|
Ok, però io il problema lo ho principalmente se inserisco date diverse dalla data corrente. Nello specifico inserisco date di nascita es 14/02/1988 su db la data viene visualizzata come 1988-02-13. Pensi che anche in questo caso il problema sia dovuto al timezone?
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Corato (Bari)
Messaggi: 986
|
E' un problema del timezione. La data del tuo sistema è quella italiana "UTC+1", mentre di default quella di mysql è UTC. Dovresti lavorare sulla conversione delle date nel timezione corretto.
Il problema è che hai è il seguente, da input tu leggi una data senza timezione e a mezzanotte, ad esempio 10/03/2019. Questa ti viene convertita in java.util.date oppure java.sql.date "hanno la stessa interfaccia, quindi sono equiparabili. Tecnicamente dovresti usare la più moderna java.time" nel seguente modo-> data input: 10/03/2019 00:00 dopo di che tu la passi al jdbc che la trasforma nel timezione di mysql in: offsetcorrected data by jdbc: 09/03/2019 23:00 Quest'ultima viene salvata nel tuo campo data troncando le ore, e quindi in: DATE di mysql: 09/03/2019 Dopo di che quando l'andrai a reperire non avendo alcuna info sull'ora verrà trasformata in: offsetcorrected data by jdbc: 09/03/2019 01:00 E incapsulata nel tuo oggetto e montrata a video con l'ennesimo troncamento delle ore in: output data: 09/03/2019 Forse la soluzione più barbara è cambiare l'offset del db, oppure un'altra roba non ideale può essere la seguente: Imposta il data formatter del parser in questo modo: Codice:
static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd", Locale.getDefault())
Codice:
java.util.Date.from(
LocalDate.parse(request.getParameter("data"), DispatcherServlet.formatter)
.atStartOfDay()
.atZone(ZoneId.of("UTC"))
.toInstant()
)
Occhio però, come già accennato è una soluzione di ripiego e non garantisce una corretta consistenza dei dati se l'applicativo viene spostato in un'altra timezone.
__________________
Trattative concluse con: Reiser Darkside, Rhapsodyan [ITA], ugofoscolo, teosc, Globex, Estero, lelesporting, gratta, m.linus, fuku, Danyit84 korra88 tuvok960, walter.caorle, Tecnomania01, BloodFlowers |
|
|
|
|
|
#16 |
|
Junior Member
Iscritto dal: Mar 2019
Messaggi: 14
|
Infatti per l'applicativo verrà sicuramente utilizzato un altro db(mariadb credo) e quindi la soluzione di ripiego potrebbe non funzionare. Ad ogni modo grazie mille! Gentilissimo!
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Corato (Bari)
Messaggi: 986
|
Quella che ho proposto io è testata con mariadb, le API sono identiche a mysql
__________________
Trattative concluse con: Reiser Darkside, Rhapsodyan [ITA], ugofoscolo, teosc, Globex, Estero, lelesporting, gratta, m.linus, fuku, Danyit84 korra88 tuvok960, walter.caorle, Tecnomania01, BloodFlowers |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2005
Messaggi: 3290
|
Ma scusa. è una settimana che ti martello con "è il timezone", davvero costa così fatica modificare una riga del my.cnf ?
Ibanez ha fatto tutta la spiegazione corretta, ma sinceramente non capisco per quale motivo qualcuno posta una domanda, gli si dice dove verificare e risolvere, e no che ostinato come un mulo continua. Hai sistemato questo benedetto timezone nel file di configurazione? |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2005
Messaggi: 3290
|
|
|
|
|
|
|
#20 | ||
|
Senior Member
Iscritto dal: Feb 2007
Città: Corato (Bari)
Messaggi: 986
|
Quote:
Quote:
__________________
Trattative concluse con: Reiser Darkside, Rhapsodyan [ITA], ugofoscolo, teosc, Globex, Estero, lelesporting, gratta, m.linus, fuku, Danyit84 korra88 tuvok960, walter.caorle, Tecnomania01, BloodFlowers |
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:38.




















