Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-03-2019, 00:13   #1
Andreawave
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;
	}

	
	
	
	
	

}
La servlet
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();
		}
	}

}
La classe che mi permette di convertire la data dal formato stringa al formato java.sql.Date

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;
		
	}

}
Jsp con il form per l'inserimento dei dati

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>
Il Dao
[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
Andreawave è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2019, 08:42   #2
Kaya
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
Kaya è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2019, 11:36   #3
Andreawave
Junior Member
 
Iscritto dal: Mar 2019
Messaggi: 14
Quote:
Originariamente inviato da Kaya Guarda i messaggi
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
No, veramente la colonna datanascita sul db l'ho definita come date semplice e non come datetime
Andreawave è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2019, 11:52   #4
Kaya
Senior Member
 
Iscritto dal: Apr 2005
Messaggi: 3290
Quote:
Originariamente inviato da Andreawave Guarda i messaggi
No, veramente la colonna datanascita sul db l'ho definita come date semplice e non come datetime
Dai comunque un occhio ai timezone.
Inoltre vai di debug e vedi i vari valori se variano da qualche parte.
Kaya è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2019, 15:37   #5
Andreawave
Junior Member
 
Iscritto dal: Mar 2019
Messaggi: 14
Quote:
Originariamente inviato da Kaya Guarda i messaggi
Dai comunque un occhio ai timezone.
Inoltre vai di debug e vedi i vari valori se variano da qualche parte.
Ok, ho fatto un debug sia utilizzando la modalità di debug di eclipse che mettendo dei system.out per verificare la data in ingresso e in uscita dal metodo di conversione delle date.
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.
Andreawave è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2019, 16:51   #6
Kaya
Senior Member
 
Iscritto dal: Apr 2005
Messaggi: 3290
Quote:
Originariamente inviato da Andreawave Guarda i messaggi
Ok, ho fatto un debug sia utilizzando la modalità di debug di eclipse che mettendo dei system.out per verificare la data in ingresso e in uscita dal metodo di conversione delle date.
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?
Visto che se in ballo farei un test..
Ma hai verificato la configurazione cosa dice sul timezone?
Kaya è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2019, 17:55   #7
Andreawave
Junior Member
 
Iscritto dal: Mar 2019
Messaggi: 14
Quote:
Originariamente inviato da Kaya Guarda i messaggi
Visto che se in ballo farei un test..
Ma hai verificato la configurazione cosa dice sul timezone?
Ok ora provo..

Ultima modifica di Andreawave : 07-03-2019 alle 18:04.
Andreawave è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2019, 18:22   #8
Andreawave
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
Andreawave è offline   Rispondi citando il messaggio o parte di esso
Old 08-03-2019, 08:19   #9
Kaya
Senior Member
 
Iscritto dal: Apr 2005
Messaggi: 3290
Quote:
Originariamente inviato da Andreawave Guarda i messaggi
Ok, ho provato ma ottengo lo stesso identico risultato, con la differenza che, usando datetime ottengo pure l'orario in formato HH:MM:SS
Accedi al database mysql e fai:
select now();
e verifica se data e ora coincidono con la data e l'ora corrente.
Kaya è offline   Rispondi citando il messaggio o parte di esso
Old 08-03-2019, 11:46   #10
Andreawave
Junior Member
 
Iscritto dal: Mar 2019
Messaggi: 14
Quote:
Originariamente inviato da Kaya Guarda i messaggi
Accedi al database mysql e fai:
select now();
e verifica se data e ora coincidono con la data e l'ora corrente.
Fatto. La data coincide(2019-03-08) ma l'ora non coincide proprio. Risultano essere le 04:44:48
Andreawave è offline   Rispondi citando il messaggio o parte di esso
Old 08-03-2019, 11:59   #11
Kaya
Senior Member
 
Iscritto dal: Apr 2005
Messaggi: 3290
Quote:
Originariamente inviato da Andreawave Guarda i messaggi
Fatto. La data coincide(2019-03-08) ma l'ora non coincide proprio. Risultano essere le 04:44:48
E' da ieri che ti dico di impostare la timezone corretta sul mysql.
Kaya è offline   Rispondi citando il messaggio o parte di esso
Old 08-03-2019, 12:04   #12
Andreawave
Junior Member
 
Iscritto dal: Mar 2019
Messaggi: 14
Quote:
Originariamente inviato da Kaya Guarda i messaggi
E' da ieri che ti dico di impostare la timezone corretta sul mysql.
Come si fa per settarla?
Andreawave è offline   Rispondi citando il messaggio o parte di esso
Old 08-03-2019, 12:30   #13
Kaya
Senior Member
 
Iscritto dal: Apr 2005
Messaggi: 3290
Quote:
Originariamente inviato da Andreawave Guarda i messaggi
Come si fa per settarla?
nel my.cnf di mysql
Kaya è offline   Rispondi citando il messaggio o parte di esso
Old 08-03-2019, 12:54   #14
Andreawave
Junior Member
 
Iscritto dal: Mar 2019
Messaggi: 14
Quote:
Originariamente inviato da Kaya Guarda i messaggi
nel my.cnf di mysql
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?
Andreawave è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2019, 12:28   #15
Ibanez89
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())
Crea un oggetto data per il tuo model in questo modo:

Codice:
java.util.Date.from(
                        LocalDate.parse(request.getParameter("data"), DispatcherServlet.formatter)
                                .atStartOfDay()
                                .atZone(ZoneId.of("UTC"))
                                .toInstant()
                )
Così fatto dovresti aver parsato la data in un oggetto "Zonizzato", gli normalizzi l'orario e lo converti in UTC, dopo di che lo trasformi in tipo java.util.date "che come già accennato, per il Principio di sostituzione di Liskov è intercambiabile con java.sql.date, il quale però per ovvie ragioni di information hiding e limitazioni di dipendente infra-tier dovrebbe però essere relegato solo nel data access layer" e lo salvi nel tuo model.

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
Ibanez89 è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2019, 15:03   #16
Andreawave
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!
Andreawave è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2019, 17:02   #17
Ibanez89
Senior Member
 
Iscritto dal: Feb 2007
Città: Corato (Bari)
Messaggi: 986
Quote:
Originariamente inviato da Andreawave Guarda i messaggi
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!
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
Ibanez89 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2019, 08:45   #18
Kaya
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?
Kaya è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2019, 08:46   #19
Kaya
Senior Member
 
Iscritto dal: Apr 2005
Messaggi: 3290
Quote:
Originariamente inviato da Ibanez89 Guarda i messaggi
Quella che ho proposto io è testata con mariadb, le API sono identiche a mysql
Beh fondamentalmente MariaDB è il fork di MySql...
Kaya è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2019, 20:39   #20
Ibanez89
Senior Member
 
Iscritto dal: Feb 2007
Città: Corato (Bari)
Messaggi: 986
Quote:
Originariamente inviato da Kaya Guarda i messaggi
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?
Magari lavora su un db remoto e/o non può farlo per problemi di autorizzazioni

Quote:
Beh fondamentalmente MariaDB è il fork di MySql...
Sono pressappoco identici https://mariadb.com/kb/en/library/ma...compatibility/
__________________
Trattative concluse con: Reiser Darkside, Rhapsodyan [ITA], ugofoscolo, teosc, Globex, Estero, lelesporting, gratta, m.linus, fuku, Danyit84 korra88 tuvok960, walter.caorle, Tecnomania01, BloodFlowers
Ibanez89 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Zscaler Threat Report 2026: l'adozione d...
Claude AI minaccia omicidi e ricatti qua...
Dentro la gara: a Milano Cortina 2026 i ...
Samsung Display presenta QD-OLED Penta T...
KONAMI torna con "Silent Hill: Town...
Rende il citofono smart a 44,99€: Ring I...
ThunderX3 XTC, la sedia da ufficio che s...
Mercy, Mission Impossible, Aronofsky: il...
Project Windless: il nuovo action in esc...
Saros: mostrato il gameplay del gioco de...
God of War: Sons of Sparta annunciato e ...
John Wick torna in un nuovo videogioco a...
MADE chiude il 2025 con 59 partner e 250...
007 First Light: allo State of Play un n...
Gli iPhone su Amazon costano meno che su...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:05.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v