# Nächsten Montag ermitteln



## CalendarNoob (15. Nov 2011)

Hallo,

ich habe zwei Date-Objekte 
	
	
	
	





```
Date startDate
```
 und 
	
	
	
	





```
Date endDate
```
, die ich einer Funktion übergeben möchte. 

Wenn z.B. der 15.11.2011 übergeben wird, dann soll der nächste Montag als 
	
	
	
	





```
startDate
```
 genommen werden. 

Habe es so versucht, aber funktioniert nicht.


```
public class TestDate {

public static void main(String[] argv) {

Date startDate = new Date();
					
					SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
					try {
						startDate = df.parse("2011-11-17");
					} catch (ParseException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					int weekday = now.get(Calendar.DAY_OF_WEEK);  
					if (weekday != Calendar.MONDAY)  
					{
					    int days = (Calendar.SATURDAY - weekday + 2) % 7;  
					    now.add(Calendar.DAY_OF_YEAR, days);  
					}  
					
					Date date = startDate;  
					String format = new SimpleDateFormat("yyyy.MM.dd").format(date);  
					
					System.out.println(format);
}
}
```

Kann jemand helfen?


----------



## nrg (15. Nov 2011)

warum setzt du DAY_OF_WEEK nicht auf Montag und addierst dann eine Woche?


----------



## CalendarNoob (15. Nov 2011)

Wie mache ich das?


----------



## CalendarNoob (15. Nov 2011)

Hab's versucht, aber haut nicht hin:


```
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateTest {

	public static void main(String[] argv) {

		Date startDate = new Date();
		
		Calendar now = Calendar.getInstance();

		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		try {
			startDate = df.parse("2011-11-16");
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		
		
		int weekday = now.get(Calendar.DAY_OF_WEEK);
		weekday++;
		
//		if (weekday != Calendar.MONDAY) {
//			int days = (Calendar.SATURDAY - weekday + 2) % 7;
//			now.add(Calendar.DAY_OF_YEAR, days);
//		}
		
		now.add(weekday, 7);

		Date date = now.getTime();;
		String format = new SimpleDateFormat("yyyy.MM.dd").format(date);

		System.out.println(format);
	}
}
```


----------



## Gossi (15. Nov 2011)

Suchst du sowas?


```
public static void main(final String[] argv) {

		Date startDate = new Date();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		int abstand = 0;
		System.out.println(df.format(startDate));
		if (Calendar.DAY_OF_WEEK != Calendar.MONDAY) {
			abstand = Calendar.MONDAY - Calendar.DAY_OF_WEEK;
			if (abstand < 0) {
				abstand *= -1;
			}
		}
		long millis = startDate.getTime() + (86400000 * (abstand + 1));
		Date neuesDatum = new Date(millis);
		System.out.println(df.format(neuesDatum));
	}
```


----------



## SlaterB (15. Nov 2011)

was soll denn
> weekday++;
bedeuten?
entweder mit set() den Weekday auf Montag setzen, wie vorgeschlagen wurde,
oder das Originalprogramm weiterbenutzen, scheint schon weitgehend zu stimmen,
nur
> Date date = now.getTime();
fehlte im ersten Code noch, da war es ganz egal was mit now passierte,
die Definition von now + überhaupt Verknüpfung mit startdate fehlte auch, davon ganz abgesehen..


----------



## Landei (15. Nov 2011)

Generell kann ich bei komplizierteren Zeit-Manipulationen nur Joda-Time empfehlen.


----------



## CalendarNoob (15. Nov 2011)

Funktioniert nun perfekt:


```
private Date setStartDateToMonday(Date startDate) throws ParseException {
		Calendar getNextMonday = Calendar.getInstance();
		getNextMonday.setTime(startDate);

		int weekday = getNextMonday.get(Calendar.DAY_OF_WEEK);
		if (weekday != Calendar.MONDAY) {
			int days = (Calendar.SATURDAY - weekday + 2) % 7;
			getNextMonday.add(Calendar.DAY_OF_YEAR, days);
		}
		Date date = getNextMonday.getTime();
		return date;
	}
```

Wenn ich nun den vergangenen Sonntag bestimmen könnte, wäre ich überglücklich. Jemand vielleicht einen schnellen Tipp, was ich an meinem Code ändern muss?


----------



## SlaterB (15. Nov 2011)

hmm, das ist doch dasselbe, nur in grün statt gelb und eckig statt rund,
du musst abziehen bzw. negatives addieren und zwar wieder relativ zum aktuellen Tag,

> Calendar.SATURDAY - weekday
als Standard kann bleiben,
danach +2 steht für nächsten Montag, +1 wäre was anderes, -60 wäre was anderes, musst nur irgendwas passendes finden..,
das % 7 kann im Moment natürlich begrenzen.., sollte vielleicht vor dem +2 oder anderes passieren


----------



## CalendarNoob (15. Nov 2011)

Stimmt, war auch irgendwie sinnfrei danach zu fragen. Das Datum um den vergangenen Sonntag zu bestimmen: 


```
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateTest {

	public static void main(String[] argv) throws ParseException {
		
		Date startDate = new Date();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		startDate = df.parse("2011-11-01");
		df.format(startDate);
		
		Calendar now = Calendar.getInstance();
		now.setTime(startDate);
	
		 int weekday = now.get(Calendar.DAY_OF_WEEK);  
         if (weekday != Calendar.MONDAY)  
         {
             int days = (Calendar.SATURDAY - weekday - 6) % 7;  
             now.add(Calendar.DAY_OF_YEAR, days);  
         }  
         
         Date date = now.getTime();
         String format = new SimpleDateFormat("yyyy.MM.dd").format(date);  
         
         System.out.println(format);
		
	}
}
```


Danke euch für eure großartige Hilfe!


----------



## CalendarNoob (15. Nov 2011)

Bin noch nicht ganz fertig. Kann ich obigen Code auch benutzen, wenn ich das übergebene Startdatum auf den 1. des nächsten Monats setzen möchte? Wie würd ich das in diesem Fall machen?


----------



## SlaterB (15. Nov 2011)

statt DAY_OF_WEEK geht es um einen anderen DAY, statt MONDAY um einen anderen einfachen Wert,
aber hier kann man dann auch wirklich mit der set-Methode direkt den gewünschten Monatstag setzen


----------



## CalendarNoob (15. Nov 2011)

Hi,

habe das versucht, aber es gibt mir den 1. des aktuellen Monats zurück. 


```
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateTest {

	public static void main(String[] argv) throws ParseException {

		Date today = new Date();
		DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		
		today = sdf.parse("2011-08-23");

		Calendar calendar = Calendar.getInstance();
		calendar.setTime(today);

		calendar.set(Calendar.DAY_OF_MONTH, 1);

		Date firstDayOfMonth = calendar.getTime();

		
		System.out.println("Heute                         : " + sdf.format(today));
		System.out
				.println("Erster Tag des nächsten Monats: " + sdf.format(firstDayOfMonth));

	}
}
```

Stimmt ja nicht ganz. Was muss ich bei 
	
	
	
	





```
calendar.set(Calendar.DAY_OF_MONTH, 1);
```
 ändern?


----------



## Gossi (15. Nov 2011)

CalendarNoob hat gesagt.:


> Hi,
> 
> habe das versucht, aber es gibt mir den 1. des aktuellen Monats zurück.
> 
> ...



Ähm, vielleicht solltest du das ändern ^^


----------



## SlaterB (15. Nov 2011)

> habe das versucht, aber es gibt mir den 1. des aktuellen Monats zurück. 

was um Himmels Willen hast du anderes erwartet? wenn das bei diesem Code nicht so wäre, dann wäre ich besorgt..

dass es um den nächsten Monat geht habe ich nicht unbedingt genau gelesen bzw. nicht gemeint als ich sagte dass es (nur) mit der set-Methode geht,
ganz offensichtlich kann man da erstmal nur sinnvoll Tage des aktuellen Monats bearbeiten

als weiteres keine Idee?
na da muss man dir wohl alles vorsagen..: nach dem bisherigen Zustand noch exakt einen Monat addieren


----------



## nrg (15. Nov 2011)

wie oben geschrieben, würde ich das so machen:


```
Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		cal.set(Calendar.DAY_OF_WEEK, 2);
		cal.add(Calendar.DAY_OF_MONTH, 7);
		System.out.println(cal.getTime());
```

das setzt dir den Calendar auf den nächsten Montag.


----------



## SlaterB (15. Nov 2011)

@nrg

das ist aber ein Vorgehen nahe am Abgrund,
falls man durch das set()  die Zeit vorstellt, dann wäre man schon am richtigen Tag, durch das add(7) kommt man dann eine Woche weiter,
bei Montag ist das hierzulande kaum möglich, Montag ist genau der erste Tag der Woche, mit jedem anderen Wochentag hätte man das Problem aber,

wie man an Montag == Konstante 2 sieht, ist in den USA (oder zumindest in Java-USA) der Sonntag der erste Tag der Woche, dort würde also hinsichtlich Montag das Problem bestehen:

```
public class Test {
    public static void main(String[] args)  {
        Date before = new Date(111, 10, 13);
        System.out.println(before);
        Calendar cal = Calendar.getInstance(Locale.US);
        cal.setTime(before);
        cal.set(Calendar.DAY_OF_WEEK, 2);
        System.out.println(cal.getTime());
        cal.add(Calendar.DAY_OF_MONTH, 7);
        System.out.println(cal.getTime());
    }
}
```
Ausgabe:

```
Sun Nov 13 00:00:00 CET 2011
Mon Nov 14 00:00:00 CET 2011
Mon Nov 21 00:00:00 CET 2011
```


----------



## nrg (15. Nov 2011)

ahja ok, den plan habe ich mir aber auch ausgedacht, wo ich noch dachte, dass Montag der erste Tag ist . Naja das wäre aber dann auch nur ein if mehr.


----------



## CalendarNoob (15. Nov 2011)

Nach wie vor habe ich mein Problem nicht lösen können. Ich bekomme lediglich den 1. Tag des Monats des Datums und nicht den 1. des nächsten vom ausgehenden Date-Objekt.


----------



## SlaterB (15. Nov 2011)

was soll man sonst schreiben wenn du auf Tipps mit keiner Nachfrage reagierst?

quasi auch gar nicht als Tipp bezeichnenswert, so offensichtlich:


SlaterB hat gesagt.:


> nach dem bisherigen Zustand noch exakt einen Monat addieren


----------

