none
Buß und Bettag RRS feed

  • Frage

  • Hallo zusammen,

    ich habe bei MSDN ein Routine gefunden die Feiertage berechnet.

    Das schein auch gut zu funktionieren. 

    Allerdings will es bei Buß und Bettag nicht so ganz hinhauen.

    Die Routine

     http://msdn.microsoft.com/de-de/library/bb979477.aspx 

    Der Betreffende Code

     Case Feiertage.ftBussUndBettag
                     Feiertagsdatum = DateSerial(Jahr, 12, 25) - Weekday(DateSerial(Jahr, 12, 25), vbMonday) - 4 * 7 - vbWednesday

    das bring gleich Fehler. Nun habe ich das versucht zu korrigieren. Mit etlichen versuchen, die ich hier nicht alle auflisten möchte.

    Hat sich damit schon einmal jemand beschäftigt und kennt vielleicht die Lösung des Problems ?

    lieben dank

    Bernd

     

    Dienstag, 6. September 2011 19:44

Antworten

  • Hallo Bernd,

    VB 6/VBA unterscheidet sich doch in einigen der Datums-Rechnungen.
    So liefert WeekDay einen Wert von 1 - 7, DayOfWeek verwendet 0 - 6 (als Enum).

    Eine weitgehend lineare Übersetzung wäre:

    Public Shared Sub BußundBettage()
    	For Each jahr As Integer In Enumerable.Range(2010, 6)
    		Console.WriteLine("{0} = {1}", jahr, BußundBettag(jahr))
    	Next
    End Sub
    
    Public Shared Function BußundBettag(jahr As Integer) As DateTime
    	Dim datum = New DateTime(jahr, 12, 25)
    	' DayOfWeek 0 - 6, VB WeekDay 1 - 7
    	Dim day As Integer = CInt(datum.DayOfWeek)
    	day = If((day = 0), -11, -day - 4)
    
    	datum = datum.AddDays(-4 * 7).AddDays(day)
    	Return datum
    End Function
    

    da die Enum-Werte dort als Zahlen behandelt, habe ich gleiches getan.
    Und zumindest für http://www.schulferien.org/Feiertage/feiertag_Buss-und-Bettag.html die angezeigten Werte liefert.

    Gruß Elmar

    Dienstag, 6. September 2011 20:31
    Beantworter

Alle Antworten

  • Hallo Bernd,

    VB 6/VBA unterscheidet sich doch in einigen der Datums-Rechnungen.
    So liefert WeekDay einen Wert von 1 - 7, DayOfWeek verwendet 0 - 6 (als Enum).

    Eine weitgehend lineare Übersetzung wäre:

    Public Shared Sub BußundBettage()
    	For Each jahr As Integer In Enumerable.Range(2010, 6)
    		Console.WriteLine("{0} = {1}", jahr, BußundBettag(jahr))
    	Next
    End Sub
    
    Public Shared Function BußundBettag(jahr As Integer) As DateTime
    	Dim datum = New DateTime(jahr, 12, 25)
    	' DayOfWeek 0 - 6, VB WeekDay 1 - 7
    	Dim day As Integer = CInt(datum.DayOfWeek)
    	day = If((day = 0), -11, -day - 4)
    
    	datum = datum.AddDays(-4 * 7).AddDays(day)
    	Return datum
    End Function
    

    da die Enum-Werte dort als Zahlen behandelt, habe ich gleiches getan.
    Und zumindest für http://www.schulferien.org/Feiertage/feiertag_Buss-und-Bettag.html die angezeigten Werte liefert.

    Gruß Elmar

    Dienstag, 6. September 2011 20:31
    Beantworter
  • Hallo Elmar,

    das hat es vermutlich dran gescheitert. VB6 ist mir unbekannt. 

    Und auf die Idee bin ich erst gar nicht gekommen.

     

    lieben dank

    Bernd

    Mittwoch, 7. September 2011 17:00