Laden...

Ermitteln des ersten,zweiten,... Wochentags im Monat

Erstellt von web2 vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.194 Views
W
web2 Themenstarter:in
16 Beiträge seit 2007
vor 17 Jahren
Ermitteln des ersten,zweiten,... Wochentags im Monat

Hallo zusammen,

ich bin verzweifelt auf der Suche nach einer Funktion, die mir den ersten, zweiten, dritten, vierten und auch letzten Wochentag eines Monats zurückgibt.

Welche Möglichkeit bietet mir C# für dieses Problem?

Als Beispiel nehmen wir das heutige Datum 24.1.2007
Als Ausgabe wäre "4" wünschenswert, da es der 4 Mittwoch im Monat ist.

Umgekehrt wäre es, dass ich den 4ten Mittwoch im Januar suche und das heutige Datum ausgegeben bekomme.

Danke & Gruß aus Krefeld

M
253 Beiträge seit 2006
vor 17 Jahren

System.DateTime.Today.DayOfWeek

Nur als kleinen Anreiz...
Hättest auch selber drauf kommen können 😉

mfg

Patrick

W
web2 Themenstarter:in
16 Beiträge seit 2007
vor 17 Jahren

Steh ich gerade auf dem Schlauch?
DayOfWeek gibt mir den Wochentag zurück oder nicht?
Ich habe also die Möglichkeit zu prüfen ob heute Mittwoch ist und nicht ob heute der 4te Mittwoch im Monat ist.

http://msdn2.microsoft.com/en-us/library/system.dayofweek.aspx

Oder habe ich etwas wichtiges überlesen?

B
1.529 Beiträge seit 2006
vor 17 Jahren

Du kannst aber zählen. Wenn heute Mittwoch der 24. ist, hatte ich schon am 17., am 10. und am 3. einen Mittwoch. Also ist heute der vierte Mittwoch im Monat.

EDIT:
Kurz gesagt: 24 / 7 = 3,6 > 3 => es gab drei Mittwoche vorher => heute ist der vierte.

W
web2 Themenstarter:in
16 Beiträge seit 2007
vor 17 Jahren

Richitg, zählen sollte ich können. =)

Danke euch zwei für die flotte hilfe 👍 👍

W
web2 Themenstarter:in
16 Beiträge seit 2007
vor 17 Jahren

So habe folgende Lösung anzubieten, falls jemand auch mal auf dem Schlauch stehen sollte ^^

string sDayToday = DateTime.Today.Day.ToString();
            int iDayToday = Convert.ToInt32(sDayToday);

            int iDayTodayResult = (iDayToday / 7) + 1;
            if (iDayTodayResult >= 1 && iDayTodayResult < 2) { cbJaehrlichEZDVLWochentag.SelectedIndex = 0; }
            if (iDayTodayResult >= 2 && iDayTodayResult < 3) { cbJaehrlichEZDVLWochentag.SelectedIndex = 1; }
            if (iDayTodayResult >= 3 && iDayTodayResult < 4) { cbJaehrlichEZDVLWochentag.SelectedIndex = 2; }
            if (iDayTodayResult >= 4 && iDayTodayResult < 5) { cbJaehrlichEZDVLWochentag.SelectedIndex = 3; }
            if (iDayTodayResult >= 5 && iDayTodayResult < 6) { cbJaehrlichEZDVLWochentag.SelectedIndex = 4; }

cbJaehrlichEZDVLWochentag ist eine ComboBox mit folgendem Inhalt

  • ersten
  • zweiten
  • dritten
  • vierten
  • letzten

Danke nochmal für den denkanstoß =)

T
512 Beiträge seit 2006
vor 17 Jahren

Dier 4. kann aber auch der letzte sein 🤔

e.f.q.

Aus Falschem folgt Beliebiges

W
web2 Themenstarter:in
16 Beiträge seit 2007
vor 17 Jahren

Richitg, das hat mein Test auch ergeben, aber da findet sich nach einem guten Mittagessen bestimmt eine Lösung. Oder hast du spontan eine Idee?

T
512 Beiträge seit 2006
vor 17 Jahren

Wenn du das Datum gegeben hast und testen willst ob es der letzte jeweilige Wochentag ist, musst du nur 7 Tage draufrechnen und Testen, ob sich der Monat verändert hat.

e.f.q.

Aus Falschem folgt Beliebiges

W
web2 Themenstarter:in
16 Beiträge seit 2007
vor 17 Jahren

Habs vorab so gelöst. (nicht getestet sollte aber laufen) entspricht ja in etwa deinem Lösungsvorschlag.

            string sDayToday = DateTime.Today.Day.ToString();
            string sMonthToday = DateTime.Today.Month.ToString();
            string sYearToday = DateTime.Today.Year.ToString();

            int iDaysInMonth = DateTime.DaysInMonth(Convert.ToInt32(sYearToday), Convert.ToInt32(sMonthToday));
            int iDayToday = Convert.ToInt32(sDayToday);

            int iLastWeekDay = iDaysInMonth - iDayToday;
            int iDayTodayResult = (iDayToday / 7) + 1;

            if (iDayTodayResult >= 1 && iDayTodayResult < 2) { cbJaehrlichEZDVLWochentag.SelectedIndex = 0; }
            if (iDayTodayResult >= 2 && iDayTodayResult < 3) { cbJaehrlichEZDVLWochentag.SelectedIndex = 1; }
            if (iDayTodayResult >= 3 && iDayTodayResult < 4) { cbJaehrlichEZDVLWochentag.SelectedIndex = 2; }
            if (iDayTodayResult >= 4 && iDayTodayResult < 5)
            {
                if (iLastWeekDay < 7)
                {
                    cbJaehrlichEZDVLWochentag.SelectedIndex = 4;
                }
                else
                {
                    cbJaehrlichEZDVLWochentag.SelectedIndex = 3;
                }
            }
            if (iDayTodayResult >= 5 && iDayTodayResult < 6) { cbJaehrlichEZDVLWochentag.SelectedIndex = 4; }

Danke für die freundliche Unterstützung 👍

Gelöschter Account
vor 17 Jahren

anstatt

if (iLastWeekDay < 7)
                {
                    cbJaehrlichEZDVLWochentag.SelectedIndex = 4;
                }
                else
                {
                    cbJaehrlichEZDVLWochentag.SelectedIndex = 3;
                }

kannst du auch


cbJaehrlichEZDVLWochentag.SelectedIndex = (iLastWeekDay < 7)?4:3;

nehmen

aber das ist nur ein optischer effekt... funktionell ändert sich absolut nichts.

ps: anstatt lauter if abfragen solltest du ab der ersten if prüfung mit else-if weitermachen da sonst jede einzelne bedingung geprüft wird, was bei größeren programmen einiges an performanceschwankungen verursachen kann.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo JAck30lena,

naja, wenn es darum geht, Unsinn aus dem Code zu entfernen, bietet sich ja noch wesentlich mehr.

if (iDayTodayResult ≥ 1 && iDayTodayResult < 2) ist zum Beispiel schon eine heiße Konstruktion, um festzustellen, ob iDayTodayResult eins ist.

Und dann kann man die ersten drei ifs ja zusammenfassen zu


if (iDayTodayResult <= 3) {
   cbJaehrlichEZDVLWochentag.SelectedIndex = iDayTodayResult;
}

und in der Art gibt es noch weitere Möglichkeiten.

herbivore

Gelöschter Account
vor 17 Jahren

z.b.

string sDayToday = DateTime.Today.Day.ToString();
            string sMonthToday = DateTime.Today.Month.ToString();
            string sYearToday = DateTime.Today.Year.ToString();

int -> string

int iDaysInMonth = DateTime.DaysInMonth(Convert.ToInt32(sYearToday), Convert.ToInt32(sMonthToday));
            int iDayToday = Convert.ToInt32(sDayToday);

string -> int

W
web2 Themenstarter:in
16 Beiträge seit 2007
vor 17 Jahren

Da kann ich nicht wiedersprechen... der Quellcode ist nicht gerade das was man perfomant oder sauber nennt 🤔
Werde die Verbesserungsvorschläge umsetzten.

Danke & Gruß 👍