Frage

Gegeben ein standard-Stück der Planung von Informationen, wie "am zweiten Dienstag im Juni 2009" oder "der Letzte Freitag im Juli 2009", was ist die einfachste und effizienteste Formel zu übersetzen, dass in einem Datum?

Eingänge:

  • w = Woche des Monats, Aufzählung (1., 2., 3., 4. oder Letzter)
  • d = Tag der Woche, enum Sonne durch Sa
  • m = Monat, integer
  • y = Jahr, integer

BEARBEITEN (wieder) - Es spielt keine Rolle, an welchem Tag die Woche beginnt;Ich möchte das wth Instanz d in einem bestimmten Monat.Somit ist der 2. Sonntag im Juni 2009 ist der 14 Juni, obwohl das technisch fällt in der 3. Woche im Juni;ähnlich der 1. Sonntag im Juni ist der 7. Juni, nicht null - /Ausnahme.

War es hilfreich?

Lösung

Etwas wie:

static DateTime GetDate(int year, int month, DayOfWeek dayOfWeek,
        int weekOfMonth) {
    // TODO: some range checking (>0, for example)
    DateTime day = new DateTime(year, month, 1);
    while (day.DayOfWeek != dayOfWeek) day = day.AddDays(1);
    if (weekOfMonth > 0) {
        return day.AddDays(7 * (weekOfMonth - 1));
    } else { // treat as last
        DateTime last = day;
        while ((day = day.AddDays(7)).Month == last.Month) {
            last = day;
        }
        return last;
    }
}

Andere Tipps

BEARBEITET, um fix Fehler, wenn Sie an Wochentagen wollte, war dasselbe wie dayof Woche im ersten Monat.

2. Bearbeiten, um fix Problem Disk' von Marc

static DateTime GetDate(int year, int month, 
                DayOfWeek weekDay, int week)
{  
    DateTime first = new DateTime(year, month, 1);
    int iDow = (int)weekday, iFirst = (int)first.DayOfWeek;
    int adjust = (7+iDow-iFirst)%7 - 7;
    return first.AddDays(7*week + adjust);
}
using System;

namespace date_using_week_of_month
{

    public class Example
    {
        public static DateTime WthDayDOfMonthM( int w, DayOfWeek d, DateTime month )
        {
            return first( d, month ).AddDays( 7 * (w - 1) );
        }

        private static DateTime first( DayOfWeek d, DateTime month )
        {
            DateTime first = new DateTime(
                month.Year, month.Month, 1 );
            while ( first.DayOfWeek != d )
            {
                first = first.AddDays( 1 );
            }
            return first;
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top