Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50

    [JAVA] confronto tra due date

    Salve a tutti, sto implementando una classe Impiegato dove ad un certo punto si chiede di inserire due date e di stampare gli impiegati che sono stati assunti nelle range di queste due date. Come posso fare? Io ho provato con Gregorian Calendar (l'ho "studiato" oggi per la prima volta e non so se l'ho usato bene)..ci sono altri metodi? Perchè in questo modo riscontro degli errori. Ho provato ad inserire le date 12/10/2011 e 08/05/2011, ma mi da un problema di outOfBonds..oppure con altre date a volte stampava, ma non quelli giusti..

    Vi inserisco la mia classe e il tester:

    codice:
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.Scanner;
    
    
    public class Impiegato {
    	
    	static Scanner in = new Scanner(System.in);
    	
    	
    	//costruttore
    	public Impiegato (String cog, String sess, String dat)
    	{
    		cognome=cog;
    		sesso=sess;
    		data=dat;
    	}
    	//GET E SET DEI CAMPI DI ESEMPLARE
    	public String getSur()
    	{
    		return cognome;
    	}
    	public void setSur(String v)
    	{
    		cognome=v;
    	}
    	public String getSex()
    	{
    		return sesso;
    	}
    	public void setSex(String v)
    	{
    		sesso=v;
    	}
    	public String getData()
    	{
    		return data;
    	}
    	public void setData(String v)
    	{
    		data=v;
    	}
    	
    	//STAMPA 
    	public static void stampa(Impiegato[]v)
    	{
    		for(int i=0;i<v.length;i++)
    		{
    			System.out.println(v[i].cognome+", "
    		+v[i].sesso+", "+v[i].data);
    		}
    	}
    	//ORDINAMENTO PER COGNOME
    	//(INSERTION SORT)
    	public static void OrdSur(Impiegato[]v)
    	{
    		Impiegato temp;
    		for (int i=1;i<v.length;i++)
    		{
    			for(int j=i;j>0;j--)
    			{
    				if((v[j].cognome).compareToIgnoreCase(v[j-1].cognome)<0)
    				{
    					temp=v[j];
    					v[j]=v[j-1];
    					v[j-1]=temp;
    				}
    			}
    		}
    	}
    	
    	//Stampare tutti gli impiegati assunti tra 2 date 
    	//inseriti in input e fare in modo di dare all'utente 
    	//la possibilità di decidere se continuare 
    	//a stampare o no.
    	public static void stampaPerDate(String dt1, String dt2,Impiegato[] v)
    	{
    		//ARRAY CHE CONTERRà OGGETTI GREGORIAN
    		GregorianCalendar[] array= new 
    				GregorianCalendar[v.length];
    		Date[] array2= new Date[v.length];
    		//trasformo in gregorian dt1 e dt2
    		GregorianCalendar first= Impiegato.GrCal(dt1);
    		GregorianCalendar second= Impiegato.GrCal(dt2);
    		for(int i=0;i<v.length;i++)
    		{
    			//uso un metodo prinvato che mi trasforma
    			//la stringa DATA in una vera data
    			//trasformo tutte le date dell'array in gregorian
    			array[i]= Impiegato.GrCal(v[i].data);
    			array2[i]=array[i].getTime();
    		}	
    			//confronto
    		Date data1 = first.getTime();
    		Date data2 = second.getTime();
    			for(int j=0;j<v.length;j++)
    			{
    				if(array2[j].after(data1) || array2[j].before(data2))
    				{
    					//stampa non solo la data
    					//ma l'oggetto Impiegato 
    					System.out.println(v[j].cognome+", "
    							+v[j].sesso+", "+v[j].data);
    				}
    				else if(array2[j].equals(data1)||array2[j].equals(data2))
    				{
    					System.out.println(v[j].cognome+", "
    							+v[j].sesso+", "+v[j].data);
    				}
    				System.out.println("Inserisci:"
    						+"\n 1 se vuoi continuare la stampa"
    						+"\n 2 se vuoi interrompere la stampa");
    				int scelta = in.nextInt();
    				if(scelta==2){break;}
    				if(scelta==1);
    		
    		}	
    		
    		
    	}
    	
    	//GREGORIAN CALENDAR
    	private static GregorianCalendar GrCal(String data)
    	{
    		//String data = "05/12/1992"
    		int giorno = Integer.parseInt(data.substring(0,1));
    		int mese = Integer.parseInt(data.substring(3,4));
    		int anno = Integer.parseInt(data.substring(6,9));
    		GregorianCalendar calendario = new GregorianCalendar(anno,mese,giorno);
    		return calendario;
    	}
    	//inizializzare l'array con dati standard
    	public static Impiegato[] datiCollaudo()
    	{
    		Impiegato[] lista = new Impiegato[5];
    		lista[0]= new Impiegato("Roberti", "M", "12/04/2012");
    		lista[1]= new Impiegato("Palmisano", "M", "07/05/2011");
    		lista[2]= new Impiegato("Corretti", "F", "03/04/2012");
    		lista[3]= new Impiegato("Fiore", "F", "22/09/2012");
    		lista[4]= new Impiegato("Ansi", "M", "12/10/2011");
    		
    		return(lista);
    	}
    	
    	
    	
    	
    	
    	
    //campi esemplare
    	private String cognome;
    	private String sesso;
    	private String data;
    
    }

    tester:

    codice:
    import java.util.Scanner;
    
    
    public class Impiegato_tester {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		int scelta;
    		Impiegato[] dipendenti = null;
    		Scanner in = new Scanner(System.in);
    		
    		do
    		{
    			System.out.println("Scegli tra le seguenti azioni: "
    					+"\n1.Inserisci dati da input"
    					+"\n2.Usa dati di collaudo"
    					+"\n3.Ordina in base al cognome"
    					+"\n4.Stampa impiegati assunti tra due date"
    					+"\n5.Termina programma");
    			scelta = in.nextInt();
    			
    			switch(scelta)
    			{
    			case 1:
    				System.out.println("QUANTI IMPIEGATI VUOI INSERIRE?");
    				int num = in.nextInt();
    				dipendenti = new Impiegato[num];
    				for(int i=0;i<dipendenti.length;i++)
    				{
    					System.out.println("Cognome impiegato "+(i+1)+": ");
    					String name = in.next();
    					System.out.println("Sesso impiegato "+(i+1)+": ");
    					String sex = in.next();
    					System.out.println("Data assunzione "+(i+1)+": ");
    					String data = in.next();
    					
    					Impiegato oggetto = new Impiegato(name,sex,data);
    					dipendenti[i]=oggetto;
    					
    				}
    				break;
    				
    			case 2:
    				System.out.println();
    				System.out.println("RIEMPIMENTO CON DATI DI COLLAUDO");
    				//riempio l'array
    				dipendenti= Impiegato.datiCollaudo();
    				Impiegato.stampa(dipendenti);
    				break;
    				
    			case 3:
    				Impiegato.OrdSur(dipendenti);
    				System.out.println();
    				System.out.println("_ORDINAMENTO PER COGNOME_");
    				Impiegato.stampa(dipendenti);
    				break;
    				
    			case 4:
    				System.out.println();
    				System.out.println("STAMPA DIPENDENTI ASSUNTI TRA DUE DATE");
    				System.out.println("data inizio: ");
    				String dt1 = in.next();
    				System.out.println("data fine: ");
    				String dt2 = in.next();
    				Impiegato.stampaPerDate(dt1, dt2, dipendenti);
    					
    			}
    		
    		}while(scelta!=5);
    		System.out.println("Programma terminato!"
    				+"\nGrazie e arrivederci.");
    		
    		
    		
    		
    
    	}
    
    }

    Grazie mille!P.S. per l'esecuzione sto provando con i dati di collaudo (scelta 2 dello switch)

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    completa lo studio dell'argomento date e calendari aggiungendo SimpleDateFormat
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50
    Mi sto confondendo..perchè nell'API ci sono varie classi..c'è il gregorian calendar, c'è calendar, date e quella che hai citato tu(simple date format)..io quale dovrei usare per confrontare due date??

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da ReaSanka
    Mi sto confondendo..perchè nell'API ci sono varie classi..c'è il gregorian calendar, c'è calendar, date e quella che hai citato tu(simple date format)..io quale dovrei usare per confrontare due date??
    http://www.mkyong.com/java/how-to-co...dates-in-java/
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50
    Grazie per il link, adesso do un'occhiata
    Nel frattempo io avevo fatto così, ma me ne stampa solo 2 giusti, l'altro no...
    Ho trasformato tutto in date e ho operato solo con oggetti di questa Classe. Come mai non funziona? :/
    codice:
    public static void stampaPerDate(String dt1, String dt2,Impiegato[] v)
    	{
    		//ARRAY CHE CONTERRà OGGETTI GREGORIAN
    		Date[] array= new Date[v.length];
    		//trasformo in gregorian dt1 e dt2
    		Date first= Impiegato.GrCal(dt1);
    		Date second= Impiegato.GrCal(dt2);
    		for(int i=0;i<v.length;i++)
    		{
    			//uso un metodo prinvato che mi trasforma
    			//la stringa DATA in una vera data
    			//trasformo tutte le date dell'array in gregorian
    			array[i]= Impiegato.GrCal(v[i].data);
    			
    		}	
    			//confronto
    		
    			for(int j=0;j<v.length;j++)
    			{
    				if(array[j].getTime()>=first.getTime() || array[j].getTime()<=second.getTime() )
    				{
    					//stampa non solo la data
    					//ma l'oggetto Impiegato 
    					System.out.println(v[j].cognome+", "
    							+v[j].sesso+", "+v[j].data);
    				}
    				
    				System.out.println("Inserisci:"
    						+"\n 1 se vuoi continuare la stampa"
    						+"\n 2 se vuoi interrompere la stampa");
    				int scelta = in.nextInt();
    				if(scelta==2){break;}
    				if(scelta==1);
    		
    		}	
    		
    		
    	}
    	
    	//TRASFORMARE STRINGA IN DATA
    	private static Date GrCal(String data)
    	{
    		//String data = "05/12/1992"
    		int giorno = Integer.parseInt(data.substring(0,1));
    		int mese = Integer.parseInt(data.substring(3,4));
    		int anno = Integer.parseInt(data.substring(6,9));
    		Date calendario = new Date(anno,mese,giorno);
    		return calendario;

    Adesso proverò con il metodo riportato in quel link..

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50
    Ho provato a fare come dicevano le indicazioni del link:

    codice:
    public static void stampaPerDate(String dt1, String dt2,Impiegato[] v)
    	{
    		//ARRAY CHE CONTERRà OGGETTI DATE
    		Date array[]=new Date[v.length];
    		
    		//trasformo in date dt1 e dt2
    		Date inizio= Impiegato.Trasf(dt1);
    		Date fine= Impiegato.Trasf(dt2);
    		for(int i=0;i<v.length;i++)
    		{
    			//uso un metodo prinvato che mi trasforma
    			//la stringa DATA in una vera data
    			//trasformo tutte le date dell'array in date
    			array[i]=Impiegato.Trasf(v[i].data);
    			
    		}	
    			//confronto
    		
    			for(int j=0;j<v.length;j++)
    			{
    				if(array[j].compareTo(inizio)>=0 ||array[j].compareTo(fine)<=0  )
    				{
    					//stampa non solo la data
    					//ma l'oggetto Impiegato 
    					System.out.println(v[j].cognome+", "
    							+v[j].sesso+", "+v[j].data);
    				}
    				
    				System.out.println("Inserisci:"
    						+"\n 1 se vuoi continuare la stampa"
    						+"\n 2 se vuoi interrompere la stampa");
    				int scelta = in.nextInt();
    				if(scelta==2){break;}
    				if(scelta==1);
    		
    		}	
    		
    		
    	}
    	
    	//TRASFORMARE STRINGA IN DATA
    	private static Date Trasf(String data)
    	{
    		Date date1=null;
    		try{
    			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    			date1 = sdf.parse(data);
    			
    		}catch(ParseException ex){
        		ex.printStackTrace();}
    		return date1;
    	}

    ma adesso mi stampa tutti gli impiegati

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,317
    Veloce panoramica:

    Calendar: è una classe astratta che serve solo a mettere a disposizione metodi e costanti per il trattamento degli istanti di tempo (date / ore).

    GregorianCalendar: implementazione concreta di Calendar; permette di costruire oggetti "manipolabili" che rappresentano istanti nel tempo.

    Date: è una classe che rappresenta un preciso istante nel tempo. La quasi totalità dei suoi metodi e costruttori è stata deprecata, poichè risulta più semplice e precisa la manipolazione degli istanti di tempo tramite le implementazioni di Calendar (come, appunto, GregorianCalendar). Rimane, comunque, un'utile classe poichè molte librerie (e molte classi dello stesso core di Java) ne fanno ancora un largo uso (più che altro per confronti temporali e stampe).

    SimpleDateFormat: è un formatter, ovvero una classe di utilità che serve a formattare in output un istante di tempo nel modo che più è conveniente all'utente (in modo da visualizzare date e ore nel modo che uno preferisce) e a "parserizzare" una stringa che rappresenta un'istante temporale nel corrispondente oggetto Date.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50
    Grazie mille per la panoramica!
    Ma il metodo che ho scritto continua a stamparmi tutti i dipendenti..:/ potrebbe aver a che fare con quel Date data1= null??


    p.s. mi sono accorta di un errore..e nel confronto ho messo && al posto di || e adesso invece none ne stampa neanche uno XD

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.