2013-01-22 19 views
16

voglio ottenere il numero di settimane in month.That attuale giorni del mese precedente la scorsa settimana e la prima settimana giorni del mese successivo.Voglio ottenere il numero di settimane in un mese particolare

Qualcosa di simile a questo:

Simple Isnt it? http://i50.tinypic.com/5ml2de.png

Voglio utilizzare questo in un certo adattatore di GridView su Android e sto cercando di manipolare questo blocco di codice:

  //FIRST_DAY_OF_WEEK =0; 
    int lastDay = month.getActualMaximum(Calendar.DAY_OF_MONTH); 
    int firstDay = (int) month.get(Calendar.DAY_OF_WEEK); 
    int firstDayNextMonth = nextMonth.get(Calendar.DAY_OF_WEEK); 
    int lastDayNextMonth=nextMonth.getActualMaximum(Calendar.DAY_OF_MONTH); 
    int nextMonthdays=nextMonth.getMinimalDaysInFirstWeek(); 

    // figure size of the array 
    if (firstDay == 1) { 
     days = new String[lastDay + (FIRST_DAY_OF_WEEK * 6)]; 
    } 

    else { 
     days = new String[lastDay + firstDay - (FIRST_DAY_OF_WEEK + 1)]; 
    } 
+0

Vuoi dire per la settimana a partire da Domenica e termina il Sabato specificamente ? – Swapnil

+0

@Swapnil sì hai ragione – Nezam

+0

se martedì è selezionato devi ottenere quanti martedì in un mese giusto? –

risposta

7

L'attributo WEEK_OF_YEAR del Le lezioni di calendario possono essere utili per te. Rif: Calendar class

Creare una nuova data che sarà il primo giorno del mese, un po '. Prendi la settimana dell'anno per questo giorno, diciamo che hai un valore iniziale.

Creare una nuova data che sarà l'ultimo giorno del mese dato. Ottieni la settimana dell'anno per questo giorno, quindi ora hai il valore finale.

Ora END - Start + 1 dovrebbe essere quello che si desidera.

Potrebbe essere necessario gestire alcuni casi angolo quando la settimana si sovrappone ad un altro anno o simili. Ma penso che una volta capito bene, puoi farlo con una logica semplice.

Ecco un semplice esempio di codice. Penso che tu possa farlo funzionare e passare quello che vuoi.

 Calendar cal = Calendar.getInstance(); 
     cal.set(Calendar.YEAR, 2013); 
     cal.set(Calendar.MONTH, 1); 
     cal.set(Calendar.DAY_OF_MONTH, 1); 
     int start = cal.get(Calendar.WEEK_OF_YEAR); 
     Log.d("BLA BLA", "Value is " + start); 
     cal.set(Calendar.YEAR, 2013); 
     cal.set(Calendar.MONTH, 1); 
     cal.set(Calendar.DAY_OF_MONTH, 28); 
     int end = cal.get(Calendar.WEEK_OF_YEAR); 
     //Above line will not work for December Month, use following line for this 
     int end = isDecember?53:cal.get(Calendar.WEEK_OF_YEAR); 
     Log.d("BLA BLA", "Value is " + end); 
     Log.d("BLA BLA", "Num weeks:: " + (end - start +1)); 

Per angolo caso:

caso d'angolo si verifica solo per il mese di Januaray (Eg gennaio 2010, gennaio 2000), in questi casi la maggior parte dei giorni fanno parte della scorsa settimana del l'anno precedente in modo che il valore iniziale sarà 52 e il valore finale sarà 5. in questo caso controllare se,

  if(start > end) { 
       numweeks = end + 1; 
      } 

PS: Metterlo a diversi ingressi di test che avete ottenuto. Fammi sapere se posso migliorare su di esso una volta trovato alcun difetto.

e anche soluzione molto più semplice:

 Calendar cal = Calendar.getInstance(); 
     for(int i = 0 ; i < 11;i++){ 
      cal.set(Calendar.YEAR, 2013); 
      cal.set(Calendar.DAY_OF_MONTH, 1); 
      cal.set(Calendar.MONTH, i); 
      int maxWeeknumber = cal.getActualMaximum(Calendar.WEEK_OF_MONTH); 
      Log.d("LOG","max week number" + maxWeeknumber); 
     } 

     01-22 01:49:03.591: D/LOG(573): max week number5 
     01-22 01:49:03.602: D/LOG(573): max week number5 
     01-22 01:49:03.602: D/LOG(573): max week number6 
     01-22 01:49:03.671: D/LOG(573): max week number5 
     01-22 01:49:03.671: D/LOG(573): max week number5 
     01-22 01:49:03.671: D/LOG(573): max week number6 
     01-22 01:49:03.681: D/LOG(573): max week number5 
     01-22 01:49:03.691: D/LOG(573): max week number5 
     01-22 01:49:03.691: D/LOG(573): max week number5 
     01-22 01:49:03.711: D/LOG(573): max week number5 
     01-22 01:49:03.711: D/LOG(573): max week number5 

soluzione semplice funziona bene con i casi d'angolo:

 Calendar cal = Calendar.getInstance(); 
     for(int i = 0 ; i < 11;i++){ 
      cal.set(Calendar.YEAR, 2010); 
      cal.set(Calendar.DAY_OF_MONTH, 1); 
      cal.set(Calendar.MONTH, i); 
      int maxWeeknumber = cal.getActualMaximum(Calendar.WEEK_OF_MONTH); 
      // Month value starts from 0 to 11 for Jan to Dec 
      Log.d("LOG","For Month :: "+ i + " Num Week :: " + maxWeeknumber); 
     } 

Log:

 01-22 01:59:35.841: D/LOG(629): For Month :: 0 Num Week :: 6 
     01-22 01:59:35.841: D/LOG(629): For Month :: 1 Num Week :: 5 
     01-22 01:59:35.841: D/LOG(629): For Month :: 2 Num Week :: 5 
     01-22 01:59:35.841: D/LOG(629): For Month :: 3 Num Week :: 5 
     01-22 01:59:35.841: D/LOG(629): For Month :: 4 Num Week :: 6 
     01-22 01:59:35.852: D/LOG(629): For Month :: 5 Num Week :: 5 
     01-22 01:59:35.871: D/LOG(629): For Month :: 6 Num Week :: 5 
     01-22 01:59:35.871: D/LOG(629): For Month :: 7 Num Week :: 5 
     01-22 01:59:35.871: D/LOG(629): For Month :: 8 Num Week :: 5 
     01-22 01:59:35.871: D/LOG(629): For Month :: 9 Num Week :: 6 
     01-22 01:59:35.871: D/LOG(629): For Month :: 10 Num Week :: 5 
+0

Puoi aiutarmi con quel blocco di codice che ho fornito. Come puoi vedere sto già ottenendo alcuni valori a cui stai suggerendo? – Nezam

+0

fammi provare a metterti insieme per te come esempio – VendettaDroid

+0

grazie, ma non dirmi di occuparmi del caso d'angolo anche – Nezam

0

Supponiamo che Kno w il primo giorno del mese (sabato, domenica ecc.).

  • Se 1 ° giorno del mese è un Sunday e non è un salto di anni, allora la (correzione edit) February mese avrà solo quattro settimane. Altrimenti, in tutti i casi, dovrebbe avere almeno 5 e al massimo 6 settimane.
  • Ora, se il mese inizia il Saturday, avrete sempre 6 settimane (escluso se si tratta di febbraio quando ci saranno 5)
  • Ora, se il mese inizia il Friday, avrete 6 settimane per mesi con 31 giorni e 5 per tutti gli altri.
  • Per il resto dei casi, saranno sempre 5 settimane.

Trovare il 1 ° giorno del mese non dovrebbe essere difficile, è possibile utilizzare Calendar o altre classi di librerie di utilità data/ora. Tuttavia, immagino che potrebbero esserci soluzioni più pulite che rimuovono i casi angolari e la complessità non necessaria.

+0

I Guess Vendetta sta fornendo una soluzione più pulita se lui mi mostra un codice pulito per gestire anche i casi d'angolo. – Nezam

+1

Il 1 ° settembre 2013 è una domenica e almeno nella mia parte del mondo, quel mese si estende su 6 settimane e non su 4 come suggerito dal primo punto.Ricorda che il primo giorno della settimana è specifico per la località, ma anche se la settimana inizia quella domenica, settembre 2013 avrebbe avuto 5 settimane. Correzione – jarnbjo

+0

: volevo menzionare febbraio (nel contesto dell'anno bisestile), ma in realtà non l'ho fatto. Vedi altri problemi? – Swapnil

5

utilizzare WEEK_OF_MONTH sarà migliore, nessun problema di anno.

public static void main(String[] args) throws Exception { 
    for (String m : new String[] { "2012-11", "2012-12", "2013-01", "2013-02", "2013-03", 
       "2013-04", "2013-05", "2013-06" }) { 
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM"); 
     Date date = format.parse(m); 
     Calendar c = Calendar.getInstance(); 
     c.setTime(date); 

     int start = c.get(Calendar.WEEK_OF_MONTH); 

     c.add(Calendar.MONTH, 1); 
     c.add(Calendar.DATE, -1); 
     int end = c.get(Calendar.WEEK_OF_MONTH); 
     System.out.println(" # of weeks in " + format.format(c.getTime()) 
       + ": " + (end - start + 1)); 
    } 
} 

risultati:

# of weeks in 2012-11: 5 
# of weeks in 2012-12: 6 
# of weeks in 2013-01: 5 
# of weeks in 2013-02: 5 
# of weeks in 2013-03: 6 
# of weeks in 2013-04: 5 
# of weeks in 2013-05: 5 
# of weeks in 2013-06: 6 
+0

Ti meriti anche il segno di spunta. Ma come puoi vedere una risposta dipende da quanto ti adatti alla domanda dell'interrogante. – Nezam

0

se si vuole farlo "mano"

uso questo:

Date.prototype.getMonthWeek = function(monthAdjustement) 
{  

    var firstDay = new Date(this.getFullYear(), this.getMonth(), 1).getDay(); 

    var returnMessage = (Math.ceil(this.getDate()/7) + Math.floor(((7-firstDay)/7))); 

    return returnMessage; 

} 

Dove monthAdjustement è solo un numero intero regolazione del mese cercare rispetto alla data di oggi.

3

Possiamo utilizzare la classe di calendario e quindi fare qualcosa di simile

Calendar calendar = Calendar.getInstance(); 
System.out.println(calendar.getActualMaximum(Calendar.WEEK_OF_MONTH)); 

questo restituirà il numero di settimane nel mese corrente

Problemi correlati