2010-01-21 15 views
20

Mi spiego. Conoscendo il numero della settimana e l'anno di una data:Come arrivare primo giorno di un dato numero settimana in Java

Date curr = new Date(); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(curr); 
int nweek = cal.WEEK_OF_YEAR; 
int year = cal.YEAR; 

Ma ora non so come ottenere la data del primo giorno di quella settimana. Ho cercato in calendario, la data, DateFormat ma niente che possa essere utile ...

Qualsiasi suggerimento? (Lavorando in Java)

risposta

38

Quei campi non restituisce i valori. Quelli sono costanti che identifica i campi nell'oggetto Calendar cui è possibile ottenere/set/aggiungere. Per ottenere ciò che desideri, devi prima ottenere uno Calendar, cancellarlo e impostare i valori noti. Imposta automaticamente la data sul primo giorno di quella settimana.

// We know week number and year. 
int week = 3; 
int year = 2010; 

// Get calendar, clear it and set week number and year. 
Calendar calendar = Calendar.getInstance(); 
calendar.clear(); 
calendar.set(Calendar.WEEK_OF_YEAR, week); 
calendar.set(Calendar.YEAR, year); 

// Now get the first day of week. 
Date date = calendar.getTime(); 

Si prega di imparare a leggere il javadocs per imparare a utilizzare le classi/metodi/campi e non cercare di colpire a caso nel vostro IDE;)

Detto questo, il java.util.Date e java.util.Calendar sono epic failures . Se è possibile, prendere in considerazione il passaggio a Joda Time.

+3

Nota che i numeri delle settimane dipendono dalle impostazioni locali. Sii assolutamente certo che le tue impostazioni locali siano corrette! –

+1

attualmente usando il tempo Joda, molto più facile da lavorare, mi sento di raccomandare il passaggio ad esso –

+0

Grazie, questo è esattamente quello che mi serviva. Ad ogni modo, darò un'occhiata a Joda Time come mi hai suggerito. Sono ancora al livello principiante, devo ancora imparare molto. – framara

2

io non ho fatto molto Data roba in Java ma una soluzione potrebbe essere:

cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) - cal.get(Calendar.DAY_OF_WEEK)); 

Logic:

ottenere il giorno della settimana e sottrarre a partire dalla data corrente (potrebbe essere necessario - 1, a seconda del tempo che si ha bisogno lunedi essere il primo giorno della settimana o domenica)

0

Ecco un codice rapido e sporco per fare questo. Questo codice crea un oggetto calendario con la data del giorno corrente, calcola il giorno corrente della settimana e sottrae il giorno della settimana in modo da essere il primo (domenica). Anche se sto usando DAY_OF_YEAR, va bene per gli anni (in 1/2/10 restituirà il 27/12/09 che è giusto).

import java.text.Format; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 


public class DOW { 

    public static void main(String[] args) { 
     DOW dow = new DOW(); 
     dow.doIt(); 
     System.exit(0); 
    } 

    private void doIt() { 
     Date curr = new Date(); 
     Calendar cal = Calendar.getInstance(); 
     cal.setTime(curr); 
     int currentDOW = cal.get(Calendar.DAY_OF_WEEK); 
     cal.add(Calendar.DAY_OF_YEAR, (currentDOW * -1)+1); 

     Format formatter = new SimpleDateFormat("MM/dd/yy"); 
     System.out.println("First day of week="+formatter.format(cal.getTime())); 
    } 
} 
0

essere cauti con coloro, calendar.get(Calendar.WEEK_OF_YEAR) restituisce 1 se è fine di dicembre e già una settimana che si conclude il prossimo anno.

Uso

//   cal2.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR)); 
//   cal2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 

imposta la data CAL2 per esempio fine 2009 il 29/12/2010 !!

ho usato questo:

cal2.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR)); //to round at the start of day 
cal2.set(Calendar.YEAR, cal.get(Calendar.YEAR)); 
cal2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); //to round at the start of week 

Assicurati anche che le settimane nei miei calendari, non importa quello locale si trovano, stanno iniziando il lunedì:

cal.setFirstDayOfWeek(Calendar.MONDAY); 
cal2.setFirstDayOfWeek(Calendar.MONDAY); 
3

Prova questo:

public static Calendar setWeekStart(Calendar calendar) { 
    while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) { 
    calendar.add(Calendar.DATE, -1); 
    } 
    setDayStart(calendar); // method which sets H:M:S:ms to 0 
    return calendar; 
} 
+0

Calendar.MONDAY deve essere cambiato a calendar.getFirstDayOfWeek() –

+0

Vero, aggiornato esso – Tarion

1

ancora un altro modo ...

GregorianCalendar cal = new GregorianCalendar(); 
    cal.clearTime(); 
    Integer correction = 1-cal.get(GregorianCalendar.DAY_OF_WEEK) 
    cal.add(Calendar.DATE, correction); 

Cal è ora il primo giorno della settimana

1-cal.get(GregorianCalendar.DAY_OF_WEEK)

viene valutata a 1-1 per la Domenica (primo giorno della settimana nel mio Locale) e 1-2 per il Lunedi, quindi questo vi darà la correzione necessaria per riavvolgere l'orologio indietro alla Domenica

0

Prova l'algoritmo Calendario gregoriano:

public int getFirstDay(int m, int year) 
    { 
     int k=1; 
     int c, y, w, M=0; 
     if(m>2 && m<=12) M=m-2; 
     else if(m>0 && M<=2) 
     { 
      M=m+10; 
      year-=1; 
     } 
     c=year/100; 
     y=year%100; 
     w=(int)((k+(Math.floor(2.6*M - 0.2))-2*c+y+(Math.floor(y/4))+(Math.floor(c/4)))%7);//a fantastic formula   
     if(w<0) w+=7; 
     return w;//thus the day of the week is obtained! 
    } 
Problemi correlati