Newsgroup: it.comp.java
Titolo: Comparazione di GregorianCalendar e jvm 1.3

Buongiorno a tutti.
Oggi mi sono scontrato con il problema in oggetto. Infatti per
comparare due gregorian calendar, la cosa è facile:
 
	GregorianCalendar gc1 = new GregorianCalendar();
	GregorianCalendar gc2 = new GregorianCalendar();
	gc1.compareTo(gc2);
Peccato che questo metodo se si usa una jvm precedente alla 1.4 (il
mio caso) non esiste. Esiste però nell'oggetto Date.
Peccato che l'oggetto Date è deprecato.
Per il momento, dovendo ciclare un'arco di tempo tra due date, e fare
delle operazioni per ogni giorno che intercorre tra queste, ho usato
un metodo (a me non piace) come il seguente:
Date dtFrom = new Date(Integer.parseInt(from.substring(0,4)), 
					Integer.parseInt(from.substring(5,7)), 
					Integer.parseInt(from.substring(8,10))
				);
Date dtTo = new Date(Integer.parseInt(to.substring(0,4)), 
					Integer.parseInt(to.substring(5,7)), 
					Integer.parseInt(to.substring(8,10))
				);
while(dtFrom.compareTo(dtTo) <= 0){
	GregorianCalendar gc = new GregorianCalendar(dtFrom.getYear(),
dtFrom.getMonth(), dtFrom.getDate());
	gc.add(Calendar.DATE, 1);
	dtFrom.setYear(gc.get(GregorianCalendar.YEAR));
	dtFrom.setMonth(gc.get(GregorianCalendar.MONTH));
	dtFrom.setDate(gc.get(GregorianCalendar.DAY_OF_MONTH));
}
eh già, infatti l'oggetto Date non implementa il metodo add.
Voi come lo avreste risolto? Io eviterei volentieri di usare l'oggetto
Date (in quanto deprecato), ma non ho neanche voglia di implementarmi
una classe che estende la Gregorian per implementare il metodo
compareTo (visto che è una cosa provvisoria che andrà a morire entro
domani).
Ciao e grazie D.

 Peccato che l'oggetto Date è deprecato.
La classe Date *non* e' deprecata. Anzi!
Alcuni costruttori e alcuni metodi di Date sono deprecati.
- Dario

...

Ok, intendevo dire quello (come al solito mi sono espresso male). :)
Alla fine, come avreste risolto il mio problema?
Ciao D.

 Alla fine, come avreste risolto il mio problema?
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
Calendar calFrom = Calendar.getInstance().setTime(sdf.parse(from));
Calendar calTo   = Calendar.getInstance().setTime(sdf.parse(to));
while(calFrom.before(calTo)) {
    // Here calFrom is handled
    // and eventually a Date is extracted from it using
    // Date d = calFrom.getTime();
    calFrom.add(Calendar.DATE, 1);
}

Mi rispondo da solo.
Quando mi ricorderò di guardare anche le specifiche delle API relative
alle classi genitrici, allora eviterò di fare il lavoro 2 volte!
Con il CregorianCalendar, si ha a disposizione i metodi after/before e
percui il codice che mi serviva eccolo e pure banale :)
<%@ page import="java.util.*"%>
<%
String from = request.getParameter("from");
String to = request.getParameter("to");
String s = "";
String[] days = new String[]{"","Dom","Lun","Mar","Mer","Gio","Ven","Sab"};
GregorianCalendar dtFrom = new
GregorianCalendar(Integer.parseInt(from.substring(0,4)),
					Integer.parseInt(from.substring(5,7))-1, 
					Integer.parseInt(from.substring(8,10))
				);
GregorianCalendar dtTo = new
GregorianCalendar(Integer.parseInt(to.substring(0,4)),
					Integer.parseInt(to.substring(5,7))-1, 
					Integer.parseInt(to.substring(8,10))
				);
while(!dtFrom.after(dtTo)){
	s = dtFrom.get(GregorianCalendar.DAY_OF_MONTH) + "/" +
(dtFrom.get(GregorianCalendar.MONTH)+1) +
		'\t' + days[dtFrom.get(GregorianCalendar.DAY_OF_WEEK)] + 
		'\t' + String.valueOf((int)(Math.random() * 2500)) + 
		'\t' + String.valueOf((int)(Math.random() * 5000)) + 
		'\t' + String.valueOf((int)(Math.random() * 7000));
	out.println(s + "<bR>");
	dtFrom.add(Calendar.DATE, 1);
}
%>
Adesso che ho sistemato il codice, posso anche buttarlo visto che non
serve più :)
Ciao a tutti e grazie.
PS: perchè il costruttore di Date(int, int, int), metodi setYear() etc
sono deprecati?

 sono deprecati?
E' abbastanza semplice:
     perche' si specifica la tripla anno/mese/giorno
     senza specificare il calendario.
Se non specifichi il calendario, come fai a capire
a quale istante temporale (cioe' a quale Date) si riferisca una 
determinata tripla anno/mese/giorno?
Ad esempio la tripla 2004/02/24 indica istanti temporali differenti 
(cioe' Date differenti) se considerata nel calendario giuliano,
gregoriano, musulmano, azteco, maya, etc...
Quindi la tripla anno/mese/giorno da sola non specifica mai un istante 
temporale, cioe' un Date.
- Dario