Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di tony83
    Registrato dal
    Feb 2005
    Messaggi
    3,179

    [Java2] <Formattazione date per insert e recupero da db SqlServer> Formattazione date

    Scusate quale è il modo migliore per gestire le date con il db?
    nel senso come si fa a formattare una data in sqlServer con Java sapendo che il tipo di dato nel db è un datetime di 8 e che ho a disposizione una stringa cosi formata
    "18/04/1983"?
    devo poi recuperarlo nello stesso formato..

    Sto con jdk 6.

    Come è il codice, sia di formattazione per inserimento sia per formattazione di recupero?

    GRazie anticipatamente
    Tony

  2. #2
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    regalino !!

    codice:
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.StringTokenizer;
    import java.util.Calendar;
    import java.util.TimeZone;
    
    
    
    public class DateHelper {
    	
    	// DEFINISCO PROPRIETA'
    	private static String format = "dd/MM/yyyy HH:mm:ss";
    	private static String simpleFormat = "dd/MM/yyyy";
    	private static String bakFormat = "yyyy/MM/dd HH:mm:ss";
    
    
    	// CONVERSIONE FORMATO DATA --> STRINGA
    	public String dateToString(Date date, String format) {
    		SimpleDateFormat formatter = new SimpleDateFormat(format);
    		return formatter.format(date);
    	}
    	
    	
    	// FUNZIONE PER IL RECUPERO ORA FORMATO DATABASE
    	public String timeToUsr(String time) {
    		String returnValue = time.substring(0,2) + ":" + time.substring(2);
    		return returnValue;
    	}
    	
    
    	// FUNZIONE PER IL RECUPERO ORA FORMATO DATABASE
    	public String timeToDbf(String time) {
    		String returnValue = time.substring(0,2) + time.substring(3);
    		return returnValue;
    	}	
    	
    	
    	// FUNZIONE PER IL RECUPERO DELLA DATA ATTUALE FORMATO STRINGA UTENTE
    	public String dateNowToUsr(){
    		Date today = new Date();
    		String formatoData = "dd/MM/yyyy";
    		SimpleDateFormat formatter = new SimpleDateFormat(formatoData);
    		String dataOdierna = formatter.format(today);
    		return dataOdierna;
    	}
    	
    	
    	// FUNZIONE PER IL RECUPERO DELLA DATA ATTUALE FORMATO DATABASE
    	public String dateNowToDbf(){
    		Date today = new Date();
    		String formatoData = "yyyyMMdd";
    		SimpleDateFormat formatter = new SimpleDateFormat(formatoData);
    		String dataOdierna = formatter.format(today);
    		return dataOdierna;
    	}
    	
    	
    	// FUNZIONE PER IL RECUPERO DELL'ORA ATTUALE FORMATO STRINGA UTENTE
    	public String timeNowToUsr(){
    		Date now = new Date();
    		String formatoOra = "HH:mm:ss";
    		SimpleDateFormat formatter = new SimpleDateFormat(formatoOra);
    		String oraAttuale = formatter.format(now);
    		return oraAttuale;
    	}
    	
    	
    	// FUNZIONE PER IL RECUPERO DELL'ORA ATTUALE FORMATO DATABASE
    	public String timeNowToDbf(){
    		Date now = new Date();
    		String formatoOra = "HHmmss";
    		SimpleDateFormat formatter = new SimpleDateFormat(formatoOra);
    		String oraAttuale = formatter.format(now);
    		return oraAttuale;
    	}	
    	
    	
    	// FUNZIONE PER IL RECUPERO DELL'ORA ATTUALE FORMATO STRINGA UTENTE
    	public String timeNowToUsr(String formatoOra){
    		Date now = new Date();
    		//String formatoOra = "HH:mm:ss";
    		SimpleDateFormat formatter = new SimpleDateFormat(formatoOra);
    		String oraAttuale = formatter.format(now);
    		return oraAttuale;
    	}
    	
    	
    	// FUNZIONE PER IL RECUPERO DELL'ORA ATTUALE FORMATO DATABASE
    	public String timeNowToDbf(String formatoOra){
    		Date now = new Date();
    		//String formatoOra = "HHmmss";
    		SimpleDateFormat formatter = new SimpleDateFormat(formatoOra);
    		String oraAttuale = formatter.format(now);
    		return oraAttuale;
    	}		
    	
    
    	// CONVERSIONE FORMATO STRINGA --> DATA
    	public Date stringToDate(String date, String format) {
    		SimpleDateFormat formatter = new SimpleDateFormat(format);
    		Date dataConvertita = null;
    		try {
    			dataConvertita = formatter.parse(date);
    		}
    		catch (ParseException e) {
    			System.out.println("ERRORE stringToDate");
    		}
    		return dataConvertita;
    	}
    		
    		
    	// FUNZIONE PER CONVERSIONE DELLA DATA ( non usata )
    	public String usrToDbf(String dataUsr, String divisore){
    		int i;
    		StringTokenizer st = new StringTokenizer(dataUsr,divisore);
    		String [] stringheSplittate = new String[st.countTokens()];
    		i = 0;
    		while (st.hasMoreTokens()) {
    		  stringheSplittate[i] = st.nextToken();
    			i++;
    		}		
    		if (stringheSplittate[0].length() == 1){
    			stringheSplittate[0] = "0" + stringheSplittate[0];
    		}	
    		if (stringheSplittate[1].length() == 1){
    			stringheSplittate[1] = "0" + stringheSplittate[1];
    		}	
    		String giorno = stringheSplittate[0];
    		String mese = stringheSplittate[1];
    		String anno = stringheSplittate[2];
    		return anno+mese+giorno;			
    	}
    		
    	// FUNZIONE PER LA CONVERSIONE DELLA DATA	
    	public String formatDate(String date, String from, String to) { 
    		try{
    			SimpleDateFormat sdf = new SimpleDateFormat(from); 
    			Date d = sdf.parse(date); 
    			sdf = new SimpleDateFormat(to); 
    			return sdf.format(d); 
    		}catch(Exception e){
    			return "";
    		}
    	} 
    	
    	// FUNZIONE PER CALCOLO DIFFERENZA TRA DUE DATE
    	public int giorniDifferenza(String sdate1, String sdate2, String fmt, TimeZone tz){
    		SimpleDateFormat df = new SimpleDateFormat(fmt);
    		Date date1  = null;
    		Date date2  = null;
    		try {
    			date1 = df.parse(sdate1); 
    			date2 = df.parse(sdate2); 
    		}catch (ParseException pe){
    			pe.printStackTrace();
    		}
    		Calendar cal1 = null; 
    		Calendar cal2 = null;
    		if (tz == null){
    			cal1=Calendar.getInstance(); 
    			cal2=Calendar.getInstance(); 
    		}else{
    			cal1=Calendar.getInstance(tz); 
    			cal2=Calendar.getInstance(tz); 
    		}
    		// different date might have different offset
    		cal1.setTime(date1);          
    		long ldate1 = date1.getTime() + cal1.get(Calendar.ZONE_OFFSET) + cal1.get(Calendar.DST_OFFSET);
    		cal2.setTime(date2);
    		long ldate2 = date2.getTime() + cal2.get(Calendar.ZONE_OFFSET) + cal2.get(Calendar.DST_OFFSET);
    		// Use integer calculation, truncate the decimals
    		int hr1   = (int)(ldate1/3600000); //60*60*1000
    		int hr2   = (int)(ldate2/3600000);
    		int days1 = (int)hr1/24;
    		int days2 = (int)hr2/24;
    		int dateDiff  = days2 - days1;
    		int weekOffset = (cal2.get(Calendar.DAY_OF_WEEK) - cal1.get(Calendar.DAY_OF_WEEK))<0 ? 1 : 0;
    		int weekDiff  = dateDiff/7 + weekOffset; 
    		int yearDiff  = cal2.get(Calendar.YEAR) - cal1.get(Calendar.YEAR); 
    		int monthDiff = yearDiff * 12 + cal2.get(Calendar.MONTH) - cal1.get(Calendar.MONTH);
    
    		// RITORNA DIFFERENZA DATE
    		return dateDiff;
    	}
    	
    
    
    	// FUNZIONE PER AGGIUNGERE / TOGLIERE DEI GIORNI AD UNA DATA 
    	public String addDay(String dateDbf,int dayToAdd){
    		
    		String dataNew = "";
    		String DATE_FORMAT = "yyyyMMdd";
    		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
    		try{
    			Calendar c1 = Calendar.getInstance(); 
    			int anno = Integer.parseInt(dateDbf.substring(0,4));
    			int mese = Integer.parseInt(dateDbf.substring(4,6))-1;
    			int giorno = Integer.parseInt(dateDbf.substring(6,8));
    			c1.set(anno, mese, giorno);
    			c1.add(Calendar.DATE,dayToAdd);
    			dataNew = sdf.format(c1.getTime());
    		}catch (Exception e){
    			e.printStackTrace();
    		}
    		// RITORNA DIFFERENZA DATE
    		return dataNew;
    	}
    	
    	
    	// FUNZIONE CHE RESTITUISCE LA DATA DA MESE, ANNO, NUMERO SETTIMANA, GIORNO SETTIMANA
    	public String getDateFromWeek(String month_S, String year_S,  String week_of_month_S, int day_of_week) {
    		String data = "";
    		try{
    			int month = Integer.parseInt(month_S);
    			int year = Integer.parseInt(year_S);
    			int week_of_month = Integer.parseInt(week_of_month_S);
    			Calendar c = Calendar.getInstance();
    			c.set(Calendar.YEAR, year);
    			c.set(Calendar.MONTH, month-1);
    			c.set(Calendar.WEEK_OF_MONTH, week_of_month);
    			c.set(Calendar.DAY_OF_WEEK, day_of_week);
    			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    			data = sdf.format(c.getTime());
    		}catch(Exception e){
    			data = "";
    		}	
    	  return data;
    	}	
    	
    	
    	// FUNZIONE SOMMA DELLE ORE ( HH ) AD UNA DATA (AAAAMMDD) e UN'ORA (HHMM) RESTITUENDO STRINGA (AAAAMMDD + HHMM)
    	public String addHourToDateTime(String date, String hour, int hourToAdd){
    		
    		// DICHIARAZION VARIABILI
    		String hh = "";
    		String mm = "";
    		int hh_total = 0;
    		int hh_new = 0;
    		String hh_new_S = "";
    		String date_new = "";
    		int dayToAdd = 0;
    		String returnValue = "";
    		
    		try{
    			// DIVIDO L'ORA IN ORE E MINUTI
    			hh = hour.substring(0,2);
    			mm = hour.substring(2);
    			
    			// AGGIUNGO LE ORE
    			hh_total = Integer.parseInt(hh) + hourToAdd;
    			
    			// CALCOLO I GIORNI DA AGGIUUNGERE ALLA DATA
    			dayToAdd = hh_total / 24;
    			
    			// SE HO DA AGGIUNGERE DEI GIORNI
    			if(dayToAdd>0){
    				// AGGIORNO LA DATA
    				date_new = addDay(date,dayToAdd);
    			}else{
    				date_new = date;
    			}
    			
    			// RECUPERO IL NUOVO ORARIO SE HO DIFFERENZA
    			if(hh_total - (dayToAdd * 24)>=0){
    				hh_new = hh_total - (dayToAdd * 24); 
    				// PREPARO LA STRINGA ORA ( se lunghezza 1 aggiungo uno 0 )
    				if(String.valueOf(hh_new).length()==1){
    					hh_new_S = "0" + String.valueOf(hh_new);
    				}else{
    					hh_new_S = String.valueOf(hh_new);
    				}
    			}else{
    				hh_new_S = hh;
    			}
    			
    			// CALCOLO DEL VALORE FINALE DA RESTITUIRE
    			returnValue = date_new + hh_new_S + mm;
    
    			return returnValue;
    
    		}catch (Exception e){
    			return "";
    		}
    
    	}
    
    
    	// FUNZIONE PER RESTITUIRE IL GIORNO DELLA SETTIMANA DA UNA DATA
    	public int getDayWeek(String anno, String mese, String giorno){
    		
    		// IMPOSTO 0 PER EVENTUALI ERRORI
    		int returnValue = 0;
    		
    		try{
    			
    			int year = Integer.parseInt(anno);
    			// gennaio sarebbe 0, quindi per convenzione mia faccio -1
    			int month = Integer.parseInt(mese) - 1;
    			int day = Integer.parseInt(giorno);
    			
    			Calendar newCal = new GregorianCalendar();
    			newCal.set(year, month, day);
    			// BUG fix in Calendar class!
    			newCal.setTime(newCal.getTime());    
    			int dayOfWeek = newCal.get(Calendar.DAY_OF_WEEK);
    			returnValue = dayOfWeek;
    			
    		}catch(Exception e){
    			returnValue = 0;
    		}
    		
    		
    		// 1 = domenica, 2 = lunedì etc...
    		return returnValue;
    		
    	}
    	
    	
    	// FUNZIONE PER RESTITUIRE L'ANNO DA UNA DATA FORMATO STRINGA
    	public String getYearFromDate(String data){
    		String returnValue = "";
    		try{
    			returnValue = data.substring(0,4);
    		}catch(Exception e){
    			
    		}
    		return returnValue;
    	}
    	
    	// FUNZIONE PER RESTITUIRE IL MESE DA UNA DATA FORMATO STRINGA
    	public String getMonthFromDate(String data){
    		String returnValue = "";
    		try{
    			returnValue = data.substring(4,6);
    		}catch(Exception e){
    			
    		}
    		return returnValue;
    	}
    
    
    	// FUNZIONE PER RESTITUIRE IL GIORNO DA UNA DATA FORMATO STRINGA
    	public String getDayFromDate(String data){
    		String returnValue = "";
    		try{
    			returnValue = data.substring(6,8);
    		}catch(Exception e){
    			
    		}
    		return returnValue;
    	}
    	
    	
    	// FUNZIONE PER CONTROLLARE LA VALIDITA DI UNA DATA IN FORMATO AAAAMMGG
    	public boolean validateDateDbf(String dateDbf){
    		boolean returnValue = false;
    		
    		String formatoData = "yyyyMMdd";
    
    		try {
    			SimpleDateFormat formatter = new SimpleDateFormat(formatoData);
    			formatter.setLenient(false);
    			Date dt2 = formatter.parse(dateDbf);
    			returnValue = true;
    		}catch (ParseException e) {
    		}catch (IllegalArgumentException e) {
    		}
    
    		return returnValue;
    	}
    	
    
    	// FUNZIONE PER CONTROLLARE LA VALIDITA DI UNA DATA IN FORMATO AAAAMMGG
    	public boolean validateDateUsr(String dateUsr){
    		boolean returnValue = false;
    		
    		String formatoData = "dd/MM/yyyy";
    
    		try {
    			SimpleDateFormat formatter = new SimpleDateFormat(formatoData);
    			formatter.setLenient(false);
    			Date dt2 = formatter.parse(dateUsr);
    			returnValue = true;
    		}catch (ParseException e) {
    		}catch (IllegalArgumentException e) {
    		}
    
    		return returnValue;
    	}	
    	
    		
    }
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  3. #3
    è fortemente sconsigliato andare a fare delle insert "a mano", ovvero scrivendosi il codice SQL della insert. Oltre a non essere interoperabile (se poi cambi il formato della data che succede? se passi ad un db diverso??) è fonte di possibili rischi di sicurezza (SQL injection e altro).

    Il modo più appropriato è usare statement e prepared statement forniti da JDBC (http://java.sun.com/docs/books/tutor.../prepared.html). In quel caso tu usi oggetti di tipo java.sql.Date e di tutto il resto si occupa il driver. Così sei a posto per la sicurezza e il tuo codice funziona su qualunque DB tu usi (e qualunque sia il formato delle date)...
    Ivan Venuti
    Vuoi scaricare alcuni articoli sulla programmazione, pubblicati su riviste di informatica? Visita http://ivenuti.altervista.org/articoli.htm. Se vuoi imparare JavaScript leggi il mio libro: http://www.fag.it/scheda.aspx?ID=21754 !

  4. #4
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    sono andato a vedermelo perchè non si smette mai di imparare !!
    carino davvero ma che vantaggio offre oltre a quello del formato della data ?

    codice:
    PreparedStatement updateSales = con.prepareStatement(
            "UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");
    updateSales.setInt(1, 75); 
    updateSales.setString(2, "Colombian"); 
    updateSales.executeUpdate():
    è molto simile alla tradizionale scrittura della scritta SQL..
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  5. #5
    ma scusa, l'ho scritto nel posto precedente!!
    Ci riprovo (for dummies):

    1) dove definisci il formato della data? NEL DB. Quindi se vai da 7 clienti ci sta che la trovi in 7 formati diversi (ok, non è così tragica, ma sta sicuro che almeno un paio lo fanno in maniera diversa dagli altri )

    Quindi come fai a scrivere del codice portabile tra 7 clienti che usano 7 formati data diversi? Risposta: usi statement o prepared statement

    2) che succede se il tuo 8' cliente usa un DB diverso?
    RispostaA: cambi il driver JDBC.

    Bravo, peccato che tu hai scritto la insert a manina e il formato della data del nuovo DB è tutt'altro (magari cambiano anche un sacco di altre cose, compresa la gestione dei numeri decimali etc etc etc) quindi la tua applicazione non va bene.

    Risposta B: se usi statement o prepared statemend tutto va a buon fine anche con il nuovo DB


    Più chiaro?


    p.s. cmq queste son le basi del JDBC; se usate i DB con Java è bene studiarsi lo standard almeno per quanto riguarda queste cose! Sul sito segnalato la guida lo compre in toto, ma ci sono anche un sacco di altre risorse per approfondirlo ;-)
    Ivan Venuti
    Vuoi scaricare alcuni articoli sulla programmazione, pubblicati su riviste di informatica? Visita http://ivenuti.altervista.org/articoli.htm. Se vuoi imparare JavaScript leggi il mio libro: http://www.fag.it/scheda.aspx?ID=21754 !

  6. #6
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    dummies un tubo (si scherza eh.. non fraintendere)!!
    sono 5 anni che programmo in java..
    solo che sono rimasto indietro su queste novità..
    ho una classettina che fa tramite per il db.. in pratica tu dici quale è il db e la classettina ti sistema i campi e la query sql..
    sta grande novità fa la stessa cosa che faccio già da 5 anni tramite codice !!
    per questo chiedevo se faceva qualcosa.. in più !!
    comunque grazie della risposta, mi è più chiaro ora e sicuramente mi aggiornerò visto che sembra molto carina, grazie alla prossima
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  7. #7
    "nessuno nasce imparato", ovviamente, quindi non ti preoccupare: è ovvio che non si può sapere tutto di tutto.

    Però, senza polemica, ma questa classe non è propriamente una novità. Fa parte del JDBC standard e, sicuramente, esisteva anche 5 anni fa. Guarda.. ho trovato un articolo del 1998 in cui ne parla: http://www.mokabyte.it/1998/12/jdbc20.htm

    Buono studio :-)
    Ivan Venuti
    Vuoi scaricare alcuni articoli sulla programmazione, pubblicati su riviste di informatica? Visita http://ivenuti.altervista.org/articoli.htm. Se vuoi imparare JavaScript leggi il mio libro: http://www.fag.it/scheda.aspx?ID=21754 !

  8. #8
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    Originariamente inviato da ivenuti
    "nessuno nasce imparato", ovviamente, quindi non ti preoccupare: è ovvio che non si può sapere tutto di tutto.

    Però, senza polemica, ma questa classe non è propriamente una novità. Fa parte del JDBC standard e, sicuramente, esisteva anche 5 anni fa. Guarda.. ho trovato un articolo del 1998 in cui ne parla: http://www.mokabyte.it/1998/12/jdbc20.htm

    Buono studio :-)
    grrr.. maestro ignorante che ho avuto allora !!
    va beh ora ci studio, tx
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.