2010-12-27 18 views
9

Ho chiesto How to detect if a date is within this or next week in Java? ma le risposte sono state confuse, quindi ora penso che se riesco a trovare la domenica passata e la domenica in arrivo, qualsiasi giorno tra questa settimana, e qualsiasi giorno tra domenica prossima e domenica successiva sarà la prossima settimana , ho ragione ?Come arrivare domenica e domenica prossima in Java?

Quindi la mia nuova domanda è: come ottenere la domenica passata e la domenica in arrivo in Java?

+0

Cosa dovrebbe succedere se il giorno corrente è domenica? –

+0

Se oggi è domenica, è il primo giorno della settimana di 7 giorni, a partire da questa mattina 00:00 fino a domenica 00:00 di questa settimana. – Frank

risposta

12

ne dite di questo:

Calendar c=Calendar.getInstance(); 
c.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY); 
c.set(Calendar.HOUR_OF_DAY,0); 
c.set(Calendar.MINUTE,0); 
c.set(Calendar.SECOND,0); 
DateFormat df=new SimpleDateFormat("EEE yyyy/MM/dd HH:mm:ss"); 
System.out.println(df.format(c.getTime()));  // This past Sunday [ May include today ] 
c.add(Calendar.DATE,7); 
System.out.println(df.format(c.getTime()));  // Next Sunday 
c.add(Calendar.DATE,7); 
System.out.println(df.format(c.getTime()));  // Sunday after next 

Il risultato:

Sun 2010/12/26 00:00:00 
Sun 2011/01/02 00:00:00 
Sun 2011/01/09 00:00:00 

Ogni giorno tra le prime due è questa settimana, nulla tra gli ultimi due è la prossima settimana.

+1

Non è la risposta migliore. Le classi java.util.Date e .Calendar sono così cattive che persino Sun/Oracle ha rinunciato a queste. Il nuovo [pacchetto java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) è ora fornito in bundle in Java 8 per sostituire le vecchie classi. [Joda-Time] (http://www.joda.org/joda-time/) ha ispirato java.time e ha alcune caratteristiche superiori. –

+3

Se non puoi usare Java 8, questa soluzione è bellissima! Su Android, siamo limitati a Java 6 API! – nat101

+0

Per coloro che cercano una soluzione Java 8, ho inviato una risposta qui sotto. –

0

Si potrebbe provare a lavorare con il campo Calendar.WEEK_OF_YEAR, che vi dà la rappresentazione numerica della settimana entro il corrente anno.

@Test 
public void testThisAndNextWeek() throws Exception { 
    GregorianCalendar lastWeekCal = new GregorianCalendar(2010, 
      Calendar.DECEMBER, 26); 
    int lastWeek = lastWeekCal.get(Calendar.WEEK_OF_YEAR); 

    GregorianCalendar nextWeekCal = new GregorianCalendar(2011, 
      Calendar.JANUARY, 4); 
    int nextWeek = nextWeekCal.get(Calendar.WEEK_OF_YEAR); 

    GregorianCalendar todayCal = new GregorianCalendar(2010, 
      Calendar.DECEMBER, 27); 
    int currentWeek = todayCal.get(Calendar.WEEK_OF_YEAR); 

    assertTrue(lastWeekCal.before(todayCal)); 
    assertTrue(nextWeekCal.after(todayCal)); 
    assertEquals(51, lastWeek); 
    assertEquals(52, currentWeek); 
    // New Year.. so it's 1 
    assertEquals(1, nextWeek); 
} 
4

Senza l'utilizzo di un pacchetto migliore ora/data ...

DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); 
Calendar now = new GregorianCalendar(); 
Calendar start = new GregorianCalendar(now.get(Calendar.YEAR), 
     now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH)); 

while (start.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { 
    start.add(Calendar.DAY_OF_WEEK, -1); 
} 

Calendar end = (Calendar) start.clone(); 
end.add(Calendar.DAY_OF_MONTH, 7); 

System.out.println(df.format(now.getTime())); 
System.out.println(df.format(start.getTime())); 
System.out.println(df.format(end.getTime())); 

Se oggi è Domenica, si ritiene l'inizio del periodo di tempo. Se desideri un periodo di questa settimana e della prossima settimana (come risulta dalla tua domanda), puoi sostituire 14 anziché 7 nella riga end.add (...). I tempi sono impostati a mezzanotte per il confronto di un altro oggetto che si trova tra inizio e fine.

4

Per prima cosa, non utilizzare il pacchetto Data/Ora da Java. C'è un pacchetto di utilità molto migliore chiamato Joda-Time - scaricalo e usalo.

Per determinare se il vostro tempo è in questa settimana, la settimana scorsa, o qualsiasi settimana a tutti, fare questo:

  1. Creare due oggetti Intervallo - uno per la settimana scorsa e uno per questa settimana
  2. Usa il metodo contiene (lungo) per determinare quale intervallo contiene la data che stai cercando.

Ci sono molti modi interessanti per creare due settimane back to back. È possibile impostare una durata di una settimana, trovare l'ora di inizio per la prima settimana e creare solo due intervalli in base a tale ora di inizio. Sentiti libero di trovare qualsiasi altro modo che funzioni per te: il pacchetto ha numerosi modi per arrivare a ciò che desideri.


EDIT:

Joda-tempo può essere downloaded here, e qui è un esempio di come Joda farebbe questo:

// Get the date today, and then select midnight of the first day of the week 
// Joda uses ISO weeks, so all weeks start on Monday. 
// If you want to change the time zone, pass a DateTimeZone to the method toDateTimeAtStartOfDay() 
DateTime midnightToday = new LocalDate().toDateTimeAtStartOfDay(); 
DateTime midnightMonday = midnightToday.withDayOfWeek(DateTimeConstants.MONDAY); 

// If your week starts on Sunday, you need to subtract one. Adjust accordingly. 
DateTime midnightSunday = midnightMonday.plusDays(-1); 

DateTime midnightNextSunday = midnightSunday.plusDays(7); 
DateTime midnightSundayAfter = midnightNextSunday.plusDays(7); 

Interval thisWeek = new Interval(midnightSunday, midnightNextSunday); 
Interval nextWeek = new Interval(midnightNextSunday, midnightSundayAfter); 

if (thisWeek.contains(someDate.getTime())) System.out.println("This week"); 
if (nextWeek.contains(someDate.getTime())) System.out.println("Next week"); 
+1

Ama il tempo di joda, ma forse sarebbe meglio con un esempio di codice? ;) – crockpotveggies

+0

Hai ragione, avrei dovuto farlo esattamente così. Modificato. –

1

recente ho sviluppato Lamma Date che è stato progettato per risolvere questo uso

Date today = new Date(2014, 7, 1);  // assume today is 2014-07-01 
Date previousSunday = today.previousOrSame(DayOfWeek.SUNDAY); // 2014-06-29 
Date nextSunday = today.next(DayOfWeek.SUNDAY);     // 2014-07-06 
12

Ho pensato di aggiungere una soluzione Java 8 per p osterity.

final LocalDate today = LocalDate.of(2015, 11, 20); 
final LocalDate nextSunday = today.with(next(SUNDAY)); 
final LocalDate thisPastSunday = today.with(previous(SUNDAY)); 

Questo approccio funziona anche per altre classi temporali come ZonedDateTime. Come scritto, si assume le seguenti importazioni statiche:

import static java.time.DayOfWeek.SUNDAY; 
import static java.time.temporal.TemporalAdjusters.next; 
import static java.time.temporal.TemporalAdjusters.previous; 
+0

Ottima soluzione, grazie – KZoNE

Problemi correlati