PDA

View Full Version : java: Problema classe CALENDAR


sbciao82
27-12-2006, 19:11
Salve;
sto utilizzando la classe CALENDAR è ho un problema; utilizzo il seguente codice per settare il giorno della settimana nel mio calendario:

myCalendar.set (Calendar.DAY_OF_WEEK, d);

"d" e il giorno della settimana che ha un valore intero compreso tra 1 e 7.
Il risultato di questa linea di codice è piuttosto ambiguo infatti il valore che la classe CALENDAR attribuisce al giorno della settimana non è mai lo stesso. :muro:

Qualcuno di voi sa spiegarmi a cosa è dovuto e come posso risolvere tale problema???

Grazie a tutti.

kingv
27-12-2006, 19:53
cosa intendi che il valore non è mai lo stesso?
i giorni della settimana sono definiti come costanti nella classe Calendar (Calendar.MONDAY, Calendar.TUESDAY ecc.ecc )

sbciao82
27-12-2006, 19:56
intendo che se scrivo la seguente riga di codice:

System.out.println(myCalendar.get(Calendar.DAY_OF_WEEK));

il valore d'uscita nn corrisponde con quello da me impostato ovvero "d"

kingv
27-12-2006, 20:10
posta il frammento di codice, se io eseguo questo:

Calendar cal = Calendar.getInstance();
System.out.println(cal.get(Calendar.DAY_OF_WEEK));
cal.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
System.out.println(cal.get(Calendar.DAY_OF_WEEK));

i risultati sono quelli attesi (ovvero 4 e 3 in output)

sbciao82
27-12-2006, 20:19
prima recupero il numero del giorno da una stringa ( e lo salvo in "day_week") e con il codice che segue la converto in intero

int d=0;
String[] d_w = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
for (int i=0; i<=d_w.length;i++)
{
if (d_w[i].equals (day_week))
{
d=i+1;
break;
}
}
poi eseguo questo codice per salvarlo nel mio calendario

myCalendar.set (Calendar.DAY_OF_WEEK, d);
System.out.println(myCalendar.get(Calendar.DAY_OF_WEEK));

il risultato pero non è quello atteso :muro:

kingv
27-12-2006, 21:04
String[] d_w = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
int[] decodes = {Calendar.MONDAY, Calendar.TUESDAY, Calendar.WEDNESDAY, Calendar.THURSDAY, Calendar.FRIDAY, Calendar.SATURDAY, Calendar.SUNDAY};

for (int i=0; i<=d_w.length;i++)
{
if (d_w[i].equals (day_week))
{
myCalendar.set (Calendar.DAY_OF_WEEK, decodes[i]);
break;
}
}

sbciao82
27-12-2006, 21:33
Purtroppo il problema rimane lo stesso anche con il tuo codice.....comunque puo anche essere colpa del fatto che son stanco. Domani riguardo meglio...
Se hai qualche altro consiglio da darmi te ne sarò grato...
grazie cmq il tuo aiuto è stato già molto utile

andbin
27-12-2006, 22:08
prima recupero il numero del giorno da una stringa ( e lo salvo in "day_week") e con il codice che segue la converto in intero

int d=0;
String[] d_w = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
for (int i=0; i<=d_w.length;i++)
{
if (d_w[i].equals (day_week))
{
d=i+1;
break;
}
}
poi eseguo questo codice per salvarlo nel mio calendario

myCalendar.set (Calendar.DAY_OF_WEEK, d);
System.out.println(myCalendar.get(Calendar.DAY_OF_WEEK));

il risultato pero non è quello atteso :muro:Beh, scusa eh ma se il giorno che cerchi è "Mon" allora ti ritrovi poi con d = 1. Ma il valore 1 è Calendar.SUNDAY, non MONDAY!

( Sunday .. Monday ... happy days ... :fiufiu: )

Poi hai fatto il test i<=d_w.length per minore/uguale e non va bene (vai fuori dall'array se non trovi il giorno).

kingv
27-12-2006, 22:18
Purtroppo il problema rimane lo stesso anche con il tuo codice.....comunque puo anche essere colpa del fatto che son stanco. Domani riguardo meglio...
Se hai qualche altro consiglio da darmi te ne sarò grato...
grazie cmq il tuo aiuto è stato già molto utile


strano.
la correzione di andbin è corretta, se day_week è diverso da una delle stringhe di d_w si verifica un'eccezione.

sbciao82
28-12-2006, 11:53
Scusa ke intendi con il valore 1 è Calendar.Sunday ? :muro:
Vuo dire che i giorni della sett in Calendar sono codificati partendo da Sunday e così via? :help:

andbin
28-12-2006, 12:01
Scusa ke intendi con il valore 1 è Calendar.Sunday ? :muro:
Vuo dire che i giorni della sett in Calendar sono codificati partendo da Sunday e così via? :help:Sì, esatto. :asd:

Ma se vuoi puoi fare una cosa semplice:
String[] giorniStr = { "Mon", "Tue", .... };
int[] giorniVal = { Calendar.MONDAY, Calendar.TUESDAY, .... };Così quando trovi la stringa, vai a pescare da giorniVal allo stesso indice il valore corretto.

sbciao82
28-12-2006, 12:17
E' la stessa cosa che mi ha consigliato kingv....ma il problema rimane lo stesso!!!
Ecco il codice:

Calendar myCalendar = Calendar.getInstance();

String[] d_w = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
int[] decodes = {Calendar.MONDAY, Calendar.TUESDAY, Calendar.WEDNESDAY, Calendar.THURSDAY, Calendar.FRIDAY, Calendar.SATURDAY, Calendar.SUNDAY};

for (int i=0; i<=d_w.length;i++)
{
if (d_w[i].equals (day_week))
{
myCalendar.set (Calendar.DAY_OF_WEEK, decodes[i]);
break;
}
}
:muro:
:muro:

andbin
28-12-2006, 12:33
E' la stessa cosa che mi ha consigliato kingv.... :doh: Sì, scusa ... m'ero dimenticato :D

ma il problema rimane lo stesso!!!Cioè?
Io ho provato:
Calendar myCalendar = Calendar.getInstance();

String day_week = "Sun";

System.out.println (myCalendar.get (Calendar.DAY_OF_WEEK));

String[] d_w = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
int[] decodes = {Calendar.MONDAY, Calendar.TUESDAY, Calendar.WEDNESDAY, Calendar.THURSDAY, Calendar.FRIDAY, Calendar.SATURDAY, Calendar.SUNDAY};

for (int i=0; i<=d_w.length;i++)
{
if (d_w[i].equals (day_week))
{
myCalendar.set (Calendar.DAY_OF_WEEK, decodes[i]);
break;
}
}

System.out.println (myCalendar.get (Calendar.DAY_OF_WEEK));
E infatti stampa:
5
1

Il 5 è giovedì (THURSDAY) e poi ha impostato SUNDAY.

sbciao82
28-12-2006, 13:26
:muro:

sbciao82
28-12-2006, 16:25
:muro:
:muro:

kingv
28-12-2006, 16:42
ma ti funziona alla fine o no? :confused:

sbciao82
28-12-2006, 19:44
NO...non mi funziona!!!!!!!!!
Da quel che ho capito io....Calendar mi lascia fare tutto quel che voglio per non appesantire il sistema con chiamate a getTime, che invece viene chiamato tutte le volte che vado a fare un'altra qualsiasi operazione con il Date con cui ho inizializzato il Calendar. Per cui, provare a settare il giorno della settimana a qualcosa di diverso da quello reale del Date che ho utilizzato o da quello computato effettivamente da Calendar non ha alcun effetto reale nei passaggi successivi che faccio.
:(

lovaz
02-01-2007, 13:24
Si può fare anche con una mappa (immutabile):

...
Map<String,Integer> days = new HashMap<String,Integer>();

// carico la mappa
days.put("Mon",Calendar.MONDAY);
days.put("Tue",Calendar.TUESDAY);
days.put("Wed",Calendar.WEDNESDAY);
days.put("Thu",Calendar.THURSDAY);
days.put("Fri",Calendar.FRIDAY);
days.put("Sat",Calendar.SATURDAY);
days.put("Sun",Calendar.SUNDAY);

// la rendo costante - facoltativo
days = Collections.unmodifiableMap(days);

// recupero il numero corrispondente alla stringa (1 in questo caso)
int d = days.get( "Sun" );
...