2014-05-08 4 views
7

Qualcuno può spiegare perché ottengo quei valori durante il tentativo di analizzare una data? Ho provato tre ingressi differenti, come segue:Strano comportamento di ww SimpleDateFormat

1) Terza decade di 2013

Date date = new SimpleDateFormat("ww.yyyy").parse("02.2013"); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(date); 
System.out.println(cal.get(Calendar.WEEK_OF_YEAR) + "." + cal.get(Calendar.YEAR)); 

quali uscite: 02.2013 (come mi aspettavo)

2) Prima settimana del 2013

Date date = new SimpleDateFormat("ww.yyyy").parse("00.2013"); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(date); 
System.out.println(cal.get(Calendar.WEEK_OF_YEAR) + "." + cal.get(Calendar.YEAR)); 

Quali uscite: 52.2012 (che va bene per me, poiché la prima settimana del 2013 è anche l'ultima del 2012)

3) Seconda settimana di 2013

Date date = new SimpleDateFormat("ww.yyyy").parse("01.2013"); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(date); 
System.out.println(cal.get(Calendar.WEEK_OF_YEAR) + "." + cal.get(Calendar.YEAR)); 

quali uscite: 1.2012 (che ha assolutamente alcun senso per me)

Qualcuno sa perché questo accade ?? Devo analizzare una data nel formato (settimana dell'anno). (Anno). Sto usando lo schema sbagliato?

+1

Suggerimento: prendere in considerazione la modifica del formato della settimana dell'anno per seguire il formato non ambiguo definito dallo standard [ISO 8601] (http://en.wikipedia.org/wiki/ISO_8601#Week_dates). Così: '2014-W19'. La libreria [Joda-Time] (http://www.joda.org/joda-time/) potrebbe quindi aiutarti a analizzare e generare tali stringhe usando i suoi formattatori incorporati in [ISODateTimeFormat] (http: //www.joda. org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html) factory. –

risposta

16

Si sta usando ww, che è "settimana della settimana dell'anno", ma poi yyyy che è "anno solare" anziché "anno della settimana". Impostare la settimana della settimana e quindi impostare l'anno del calendario è una ricetta per i problemi, perché sono solo sistemi di numerazione separati, in modo efficace.

Si deve usare YYYY nella stringa di formato per specificare il week-anno ... anche se purtroppo sembra che non si può quindi ottenere il valore in un modo sano. (Mi aspetterei una costante Calendar.WEEKYEAR, ma non esiste una cosa simile.)

Inoltre, i valori di settimana dell'anno iniziano da 1, non da 0 ... e nessuna settimana è in due settimane-anni; è o la prima settimana del 2013 o è l'ultima settimana del 2012 ... non è entrambe le cose.

Eviterei personalmente di usare settimane e settimane se possibile, possono essere molto confusi, in particolare quando una data in un anno solare è in un anno diverso settimana.

+2

Grazie, ora mi rendo conto del motivo per cui ci sono yyyy e YYYY – fvdalcin

+0

Il problema (come hai detto) è che non riesco a ottenere il valore dell'anno-settimana (e ne ho bisogno, sto solo analizzando la stringa per convalidare esso). Devo pubblicare un'altra domanda per vedere se qualcuno sa come posso farlo? – fvdalcin

+3

@fvdalcin: Sì, posta un'altra domanda, ma spiega qual è la tua situazione attuale. La tua idea di "settimane dell'anno" è addirittura in linea con ciò che fa java.util.Calendar?Si potrebbe anche prendere in considerazione l'utilizzo di Joda Time, che non solo rende disponibili queste informazioni, ma è anche una migliore data/ora API sotto ogni aspetto. –

2

Utilizzare Calendar.getWeekYear() per ottenere il valore dell'anno sincronizzato con il campo Calendar.WEEK_OF_YEAR. Ci sono ulteriori informazioni su Settimana dell'anno e Anno della settimana sul documento GregorianCalendar.