2012-10-26 14 views
6

Utilizzando il calendario di Java o qualcos'altro, diciamo che ho impostato la data su 2012-10-26. Voglio che questa data sia il primo giorno di un anno. È possibile ottenere il numero della settimana di una data specifica? Diciamo che è il 2012-12-10- supponendo che la prima settimana dell'anno inizi tra il 2012-10-26?Modifica la prima settimana di un anno

So che la mia domanda sembra un po 'strana, ma potrei usare qualsiasi input utile.

Grazie.

--details

ho una tabella di database chiamato WeeklySchedule. In questa tabella ho colonne che iniziano da Week1 a Week52 e ogni colonna contiene alcuni dati relativi ai giorni della settimana. Purtroppo, settimana1 non è davvero la prima settimana dell'anno. Devo eseguire i miei calcoli presupponendo che Week1 inizi da 2012-08-26.

+0

Mostraci un codice. – kosa

+1

Hai provato qualcosa? Almeno passato la documentazione di 'Calendar'> –

+0

@Nambari ho aggiunto alcuni dettagli sul mio problema. Sfortunatamente, non ho alcun codice operativo in questo momento, perché non so come affrontare questo problema. – 629

risposta

2

Ecco uno approccio utilizzando l'API Calendario:

private static final Calendar START_CAL = createAugust26th2012Cal(); 

public int getWeekNumber(Calendar someCal) { 
    int theWeek = someCal.get(Calendar.WEEK_OF_YEAR); 
    int weekCount = 0; 
    while (theWeek != START_CAL.get(Calendar.WEEK_OF_YEAR)) { 
     someCal.add(Calendar.WEEK_OF_YEAR, -1); 
     theWeek = someCal.get(Calendar.WEEK_OF_YEAR); 
     weekCount++; 
    } 
    return weekCount; 
} 

Oppure si potrebbe ottenere il diff (in millisecondi) tra due calendari e dividere il risultato per il numero di Millis in una settimana:

Se si utilizza questo approccio, non dimenticare di prendere in considerazione i fusi orari e l'ora legale.

Non ricordo esattamente ciò che il codice è simile per compensare l'ora legale, ma penso che sia qualcosa di simile: (non riesco a ricordare se si aggiunge l'offset o sottrarre l'offset da i due operandi)

private static final long ONE_WEEK_MILLIS = 1000 * 60 * 60 * 24 * 7; 

public int getWeeksBetween(Calendar calOne, Calendar calTwo) { 
    long millisOne = calOne.getTime().getTime(); 
    long millisTwo = calTwo.getTime().getTime(); 
    long offsetOne = calOne.getTimeZone().getOffset(millisOne); 
    long offsetTwo = calTwo.getTimeZone().getOffset(millisTwo); 
    long diff = (millisTwo - offsetTwo) - (millisOne + offsetOne); 
    return diff/ONE_WEEK_MILLIS; 
} 
+0

In realtà, sto già utilizzando questo approccio, ma penso che non sia l'approccio migliore. Ci dovrebbe essere un altro modo dinamico per farlo. – 629

+0

Non sono sicuro del motivo per cui ci si aspetta che questo tipo di codice esista in una libreria. Ci vuole pochissimo lavoro per implementare te stesso. L'altro approccio che suggerirei è quello di sottrarre il tempo tra due date in millisecondi e dividere per il numero di millis in una settimana (quindi arrotondare il risultato). Non dimenticare di prendere in considerazione i fusi orari se lo fai in questo modo! – jahroy

+0

+1 per codice di lavoro. –

1

Non ho mai visto una funzione integrata per questo, solo chiamate come Calendar.get(WEEK_OF_YEAR) o Joda di LocalDate.getWeekOfWeekyear(). java.util.Calendar (e Date) è spesso considerato una libreria scadente, rispetto a una libreria come Joda Time. This SO post ha una buona lista di pro e contro.

Si noti che se la tabella del database si applica a ripetizioni anno dopo anno in un anno, è possibile che si verifichino problemi. Alcuni anni (71 years per 400, or about 1 every 5.6) hanno 53 settimane.

luce di quanto sopra, si può decidere di accontentarsi di un'approssimazione, come contando il numero di days between the two dates diviso 7 (tutto mod 52), che scivolare da una piccola quantità ogni anno, o calcolando (weekOfYear(date) - weekOfYear(startDate)) % 52, che può ripetere una settimana all'inizio dell'anno civile.

+0

+1 per la nota di alcuni anni con 53 settimane. –

Problemi correlati