Berechnung bewegliche Feiertage: easter_date()
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abstand
beispiel
code
date
datum
donnerstag
fehler
feiertag
fenster
funktion
http
jahr
label
montag
not
ostern
ostersonntag
position
sonntag
tag
-
Hallo
ich versuche das Datum zu einem beweglichen Feiertag zu berechnen
aber beim Datum (und Wochentag) stimmt bei manchen irgend was nicht,
aber ich komme nicht drauf, wo der Fehler liegt
<?php $feitertage1 = array( 'Weiberfastnacht' => '-52', 'Rosenmontag' => '-48', 'Fastnachtsdienstag' => '-47', 'Aschermittwoch' => '-46', 'Gründonnerstag' => '-3', 'Karfreitag' => '-2', 'Ostersonntag' => '0', 'Ostermontag' => '+1', 'Christi Himmelfahrt' => '+39', 'Pfingstsonntag' => '+49', 'Pfingstmontag' => '+50', 'Fronleichnam' => '+60' ); $dayofweek = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"); $jahr = '2011'; $ostersonntag1 = easter_date($jahr); $om_datum1 = date('d.m.Y',$ostersonntag1); echo "<br />Feiertage: ".$jahr."\r\n"; echo "<br />------------------------------------------------------------ \r\n"; foreach($feitertage1 as $feiertag => $abstand) { $fxtime = ($ostersonntag1 + ($abstand*3600*24)); $dow = date('w',$fxtime); $fxwtag = $dayofweek[$dow]; $fxdate = date('d.m.Y',$fxtime); echo "<br />".$feiertag." --- ".$abstand." --- ".$fxwtag." ".$fxdate."\r\n"; } echo "<br />------------------------------------------------------------ \r\n"; ?>
Die Ausgabe ist:
Feiertage: 2011
------------------------------------------------------------
Weiberfastnacht --- -52 --- Mittwoch 02.03.2011
Rosenmontag --- -48 --- Sonntag 06.03.2011
Fastnachtsdienstag --- -47 --- Montag 07.03.2011
Aschermittwoch --- -46 --- Dienstag 08.03.2011
Gründonnerstag --- -3 --- Donnerstag 21.04.2011
Karfreitag --- -2 --- Freitag 22.04.2011
Ostersonntag --- 0 --- Sonntag 24.04.2011
Ostermontag --- +1 --- Montag 25.04.2011
Christi Himmelfahrt --- +39 --- Donnerstag 02.06.2011
Pfingstsonntag --- +49 --- Sonntag 12.06.2011
Pfingstmontag --- +50 --- Montag 13.06.2011
Fronleichnam --- +60 --- Donnerstag 23.06.2011
------------------------------------------------------------
Manche sind richtig, aber einige auch Falsch ... aber Warum ?
... z.B: Rosenmontag am Sonntag ?! ... FEHLER !? ...
... z.B.: Aschermittwoch war 09. 03 und NICHT Dienstag 08.03. 2011
... usw.
entweder sind meine Abstand zu Ostersonntag Tage falsch,
oder die Berechnung ist Fehlerhaft
?
Beitrag zuletzt geändert: 8.10.2011 19:10:01 von uhrinfo -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Der Abstand der beweglichen Tage zu Ostersonntag ist richtig. Ich habe diese Tage in ein AutoItskript eingesetzt [sorry ich kann (noch) kei php] die Ausgaben davo sind korrekt. Dein Fehler müsste also in dieser Zeile
liegen. Hier einmal die Easter.au3:$fxtime = ($ostersonntag1 + ($abstand*3600*24));
und die aufrufende DemoWEaster.au3:#include <Date.au3> #include <EditConstants.au3> #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include<WindowsConstants.au3> Opt('GUIOnEventMode', 1) Opt('MustDeclareVars', 1) ;=============================================================================== ;Function Name..: _Easter($iYear [,$bQuiet] [, $sTitle] [,$hParent] [, $sEditStyle] [, $iWidth] [, $iHeight] [, $iLeft] [, $iTop]) ;Description....: errechnet das Datum von Ostern für jedes übergebene Jahr ;Parameter(s)...: $iYear = das Jahr für das Ostern errechnet werden soll ; $bQuiet = Schalter für "stumme Ausgabe" True es wird nur gerechnet aber nicht angezeigt ; $sTitle = Fenstertitel (optional) ; $hParent = ID des aufrufenden Fensters (optional, Stabdard = 0) ; wenn dieser Parameter übergeben wird verhält wird das Anzeigefenster ; Modal angezeigt, d.h. es ist automatisch im Vordergrund ; vor dem aufrufenden Fenster (verliert aber leider den Focus, beim Wechsel ; zu anderer Anwendung und wieder zurück, d.h man muß einmal in das Fenster klicken) ; $sEditStyle = Edit-Style für GUICtrl (optional) ; $iWidth = Breite des Fensters (optional, Standard = 400 Pixel) ; $iHeight = Höhe des Fensters (optional, Standard = 300 Pixel) ; $iLeft = Abstand von links (optional, Standard = zentriert) ; $iTop = Abstand von oben (optional, Standard = zentriert) ;Return Value...: Ostersonntag ;Author.........: (Auto)Bert Osterberechung Formel auf http://www.nabkal.de/gauss2.html gefunden ; " GUI-Darstellung Oscar's (www.autoit.de) _StringDisplay ; in Anfängerfragen zur GUI(Checkbox,Inputbox und welches Gui Konzept) Beitrag #5 ;=============================================================================== Func _Easter($iYear, $bQuiet = False, $sTitle = 'Ostern ', $hParent = 0, $EditStyle = -1, $iWidth = 250, $iHeight = 200, $iLeft = -1, $iTop = -1) Local $iDay, $iMonth, $sHT, $hGui Local $iA = Mod($iYear, 19) ;Gausssche Zykluszahl ;a = Jahr mod 19 ;;ConsoleWrite("A: " & $iYear & " mod 19 =" &$iA & @crlf) ;2009 mod 19 = 14 R Local $iB = Mod($iYear, 4) ;b = Jahr mod 4 ;;ConsoleWrite("B: " & $iYear & " mod 4 =" &$iB & @crlf) ;2009 mod 4 = 1 R Local $iC = Mod($iYear, 7) ;c = Jahr mod 7 ;;ConsoleWrite("C: " & $iYear & " mod 7 =" &$iC & @crlf) ;2009 mod 7 = 0 R Local $iH1 = Floor(Int($iYear / 100)) ;H1 = Jahr div 100 ;;ConsoleWrite("H1 " & $iYear & " div 100 = " & $iH1 & @crlf) ;2009 div 100 = 20 R Local $iH2 = Floor(Int($iYear / 400)) ;H2 = Jahr div 400 ;;ConsoleWrite("H2 " & $iYear & " div 400 = " & $iH2 & @crlf) ;2009 div 100 = 5 R ;Local $iAS = 15 + int($iYear/100) - int($iYear/400) -2 ;aequatio solaris ;Local $iAL = int($iYear/300) -2 ;aequtio lunaris Local $iN = 4 + $iH1 - $iH2 ; 4+20-5 = 19 ;N = 4 + H1 - H2 ;;ConsoleWrite("N: 4 +" & $iH1 & "-" & $iH2 &"=" & $iN & @crlf) Local $iM = 15 + $iH1 - $iH2 - (Floor(Int(8 * $iH1 + 13) / 25)) ;15+20-5-((8*20+13) div 25] = 24 ;M = 15 + H1 - H2- [(8 * H1 + 13) div 25] ;;ConsoleWrite("M: 15 + " & $iH1 & "-" & $iH2 & "-[8*"& $iH1 & " + 13) div 25] =" &$iM & @crlf) Local $iD = Mod((19 * $iA + $iM), 30) ;(19*14 +24) mod 30 = 20 ;d = (19 * a + M) mod 30 ;;ConsoleWrite("(D: 19 * " & $iA & " + " & $iM & ") mod 30 = " & $iD & @CRLF) Local $iE = Mod(2 * $iB + 4 * $iC + 6 * $iD + $iN, 7) ;e = (2 * b + 4 * c + 6 * d + N) mod 7 ;;ConsoleWrite("(E: 2*" & $ib & " + 4* " & $iC & " + 6*" & $iD & " + " & $iN & " Mod 7) = " & $iE & @CRLF) Local $iOS = $iD + $iE ;das sind die Anzahl der Tage nach dem 22. März ;;ConsoleWrite(@CRLF & "OS: 22 + " & $iD & " + " & $iE & " = " & $iOS & "Tage nach dem 22. März" & @CRLF) $iOS = $iOS + 22 ;22 Tage vom März If $iOS = 57 Then $iOS = 50 If ($iD = 28) And ($iE = 6) And ($iA > 10) Then $iOS = 49 $iOS = $iOS + 59 ;jetzt noch 1. Januar bis 28. Februar hinzuzählen If _DateIsLeapYear($iYear) Then $iOS = $iOS + 1 ;im Schaltjahr auch noch den 29. Februar If $bQuiet Then Return $iOS #cs a = Jahr mod 19 b = Jahr mod 4 c = Jahr mod 7 H1 = Jahr div 100 H2 = Jahr div 400 N = 4 + H1 - H2 M = 15 + H1 - H2- [(8 * H1 + 13) div 25] d = (19 * a + M) mod 30 e = (2 * b + 4 * c + 6 * d + N) mod 7z Ostern = 22 + d + e Tage nach dem 2. März wenn: (ostern = 57) dann: (ostern = 50) wenn: (d = 28) und (e = 6) und (a > 10) dann: (ostern = 49) ostern: Ostersonntag als Märzdatum #ce ;ab hier aus Beispiel von Oskar If Not IsDeclared('BS_DEFPUSHBUTTON') Then Local Const $BS_DEFPUSHBUTTON = 0x00000001 If Not IsDeclared('GUI_EVENT_CLOSE') Then Local Const $GUI_EVENT_CLOSE = 0xFFFFFFFD If Not IsDeclared('WS_EX_COMPOSITED') Then Local Const $WS_EX_COMPOSITED = 0x02000000 If Not IsDeclared('WS_MAXIMIZEBOX') Then Local Const $WS_MAXIMIZEBOX = 0x00010000 If Not IsDeclared('WS_MINIMIZEBOX') Then Local Const $WS_MINIMIZEBOX = 0x00020000 If Not IsDeclared('WS_SIZEBOX') Then Local Const $WS_SIZEBOX = 0x00040000 Local $iEventMode = Opt('GUIOnEventMode', 0) If $hParent = 0 Then ;Oscar's Beispiel $hGui = GUICreate($sTitle, $iWidth, $iHeight, $iLeft, $iTop, BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX), $WS_EX_COMPOSITED) Else ;damit sich das Fenster wie ein Toolwindow verhält $hGui = GUICreate($sTitle, $iWidth, $iHeight, $iLeft, $iTop, BitOR($DS_MODALFRAME + $DS_SETFOREGROUND, $WS_CAPTION + $WS_SYSMENU + $WS_SIZEBOX), $WS_EX_TOOLWINDOW, $hParent) GUISetState(@SW_DISABLE, $hParent) EndIf GUISwitch($hGui) GUISetState(@SW_HIDE, $hGui) ;das war ich wieder if $iYear < 1583 Then Local $hlblHinweis = GUICtrlCreateLabel("für Jahre vor 1583 keine Berechnung möglich!", 5, 5, $iWidth - 10, $iHeight - 35);, $SS_CENTER) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT + $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKRIGHT) Else Local $hlstvwHoly = GUICtrlCreateListView("Feiertag | Datum ", 5, 5, $iWidth - 10, $iHeight - 35);, BitOr($EditStyle,$LVS_EX_GRIDLINES)) GUICtrlSetResizing(-1, $GUI_DOCKBORDERS) ;GUICtrlSetResizing(-1, 2 + 4 + 32 + 64) GUICtrlCreateListViewItem(_getHolyday("Weiberfasnacht:|", $iOS - 52, $iYear), $hlstvwHoly) GUICtrlCreateListViewItem(_getHolyday("Rosenmontag:|", $iOS - 48, $iYear), $hlstvwHoly) GUICtrlCreateListViewItem(_getHolyday("Fasnachtsdienstag:|", $iOS - 47, $iYear), $hlstvwHoly) GUICtrlCreateListViewItem(_getHolyday("Aschwermittwoch:|", $iOS - 46, $iYear), $hlstvwHoly) GUICtrlCreateListViewItem(_getHolyday("Gründonnerstag:|", $iOS - 3, $iYear), $hlstvwHoly) GUICtrlCreateListViewItem(_getHolyday("Karfreitag:|", $iOS - 2, $iYear), $hlstvwHoly) GUICtrlCreateListViewItem(_getHolyday("Ostersamstag:|", $iOS - 1, $iYear), $hlstvwHoly) GUICtrlCreateListViewItem(_getHolyday("Ostersontag:|", $iOS, $iYear), $hlstvwHoly) GUICtrlCreateListViewItem(_getHolyday("Ostermontag:|", $iOS + 1, $iYear), $hlstvwHoly) GUICtrlCreateListViewItem(_getHolyday("Christi Himmelfahrt:|", $iOS + 39, $iYear), $hlstvwHoly) GUICtrlCreateListViewItem(_getHolyday("Pfingstsonntag:|", $iOS + 49, $iYear), $hlstvwHoly) GUICtrlCreateListViewItem(_getHolyday("Pfingstmontag:|", $iOS + 50, $iYear), $hlstvwHoly) GUICtrlCreateListViewItem(_getHolyday("Fronleichnam:|", $iOS + 60, $iYear), $hlstvwHoly) ;Local $hEdit = GUICtrlCreateEdit($sText, 5, 5, $iWidth - 10, $iHeight - 65, $EditStyle) EndIf Local $hClose = GUICtrlCreateButton('&Schliessen', $iWidth / 2 - 35, $iHeight - 25, 70, 25, $BS_DEFPUSHBUTTON) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT + $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT) ControlFocus($hGui, '', $hClose) GUISetState(@SW_SHOW, $hGui) While True Switch GUIGetMsg() Case $hClose, $GUI_EVENT_CLOSE ExitLoop ;Case $GUI_EVENT_RESTORE ;GuiSetState(@SW_RESTORE,$hGui) ;;ConsoleWrite("Bin wieder da") EndSwitch ;Sleep(125) WEnd ;ControlFocus($hGui, '', $hEdit) ControlFocus($hGui, '', $hlstvwHoly) ;Local $sSelectedText = ControlCommand($hGui, '', $hEdit, 'GetSelected', '') ;If @error Then $sSelectedText = '' If $hParent <> 0 Then GUISetState(@SW_ENABLE, $hParent) GUISetState(@SW_SHOWNORMAL, $hParent) EndIf GUIDelete($hGui) Opt('GUIOnEventMode', $iEventMode) Return $iOS EndFunc ;==>_Easter ;=============================================================================== ;Function Name..: _getHolyday($sHT,$iHDay,$iYear) ;Description....: ermittelt das Datum des übergegenen x. Tages des Jahres und ertstellt ; daraus zusammen mit der Bez. einen String zum Eintragen in eine 2 Spaltige Listview ;Parameter(s)...: $sHT = der String mit der Bezeichnung ( Wenn kein Datensparatorzeichen am Schluß ; wird einer angehängt ; $bHDay = der x. Tag des Jahres (1. Januar = 1) ; $iYear = Jahresdatum, muß größer 1000 sein, da _DateDays in Month bei klieneren Zahlen keinen Wert zurückliefert ;Return Value...: String für Eintrag in ListView ;Author.........: (Auto)Bert ;=============================================================================== Func _getHolyday($sHT, $iHDay, $iYear) Local $iDay, $iMonth, $i, $j, $sSep $sSep = Opt('GUIDataSeparatorChar') if StringRight($sHT,1)<>$sSep then $sHT=$sHT & $sSep ;ConsoleWrite("getHolyDay " & $iHDay & @CRLF) For $i = 1 To 12 $j = _DateDaysInMonth($iYear, $i) If $j >= $iHDay Then $iDay = $iHDay $iMonth = $i EndIf $iHDay = $iHDay - $j If $iHDay <= 0 Then ExitLoop ;ConsoleWrite($i & " : " & $j & ": getHolyDay " & $sHT & " " & $iHDay & @CRLF) Next If $iDay < 10 Then $sHT = $sHT & '0' $sHT = $sHT & $iDay $sHT = $sHT & "." If $iMonth < 10 Then $sHT = $sHT & '0' $sHT = $sHT & $iMonth $sHT = $sHT & "." & $iYear ;ConsoleWrite("Return getHolyDay " & $sHT & @CRLF) Return $sHT EndFunc ;==>_getHolyday
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Add_Constants=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <StaticConstants.au3>
#include <Date.au3>
#include <DateTimeConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include<WindowsConstants.au3>
#include <GuiListView.au3>
#include <ListviewConstants.au3>
;#Include <GuiStatusBar.au3> ;Schwierigkeiten beim Resizen 1 Linie + 1 Label tuns auch
#include<Easter.au3>
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
Global $hlstvwHoly = 0
Global $sTitel = 'Beispiele zur Nutzung der UDF _Easter'
Local $hMainGui = GUICreate($sTitel, 400, 280, 140, 150, BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
;erzeugt eine GUI die zurückgebebene ID wird in der Variablen $hMainGui gespeichert
;die GUI hat BOXen für Mininmieren, Maximieren und ist in der Größe frei änderbar
GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
;GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PDOWN')
;Verknüpft dem Event $Gui_Event_Close mit der Funktion _End
;Local $hedtYear = GUICtrlCreateInput("", 10, 10, 200, 25, $ES_NUMBER)
;Die Eingabe wird für das zuletzt erstellte Steuerelement auf 4 Zeichen begrenzt
;diese Schreibweise ist auch zulässig: GUICtrlSetLimit($hedtYear, 4)
;GUICtrlSetLimit(-1, 4)
;erzeugt ein Input Steuerelement die zurückgegebe ID wird in der Variablen $hedtYear gespeichert
;es sind nur Zahlen für die Eingabe zugelassen
Local $hedtYear = GUICtrlCreateDate(@YEAR, 110, 10, 90, 25, $DTS_UPDOWN)
;erzeugt ein Date Steuerelement die zurückgegebene ID wird in der Variablen $hedtYear gespeichert
GUICtrlSetFont(-1, 12)
Local $DTM_SETFORMAT_ = 0x1032
Local $style = "yyyy"
GUICtrlSendMsg($hedtYear, $DTM_SETFORMAT_, 0, $style)
;es werde nur Jahreszahlen für die Eingabe angezeigt zugelassen 1752 - 9999
;GUICtrlSetTip($hedtYear, "bitte Jahreszahl nach 1582 eingeben")
;setzt den Tooltip für das InputField
;_getHolyDay (eine vom Skript benutzte UserDefinedFunction funktioniert erst ab dem Jahr 1000
;ab 1583 sind die Rückgabe-Werte auch sinvoll (Kalenderreform in 1582)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT)
;verankert das Inputfield Links, rechts, oben und fixiert die Höhe
;beim Resizen bleibt es dadurch auf seiner Position und ändert nur die Breite
GUICtrlCreateButton('&zeigen (eigenes Fenster)', 220, 10, 150, 25)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKRIGHT + $GUI_DOCKTOP)
;verankert den Button "Zeigen" rechts und oben und fixiert die Größe
;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand
GUICtrlSetOnEvent(-1, '_CallEaster')
;Beim Klicken des Buttons wird die Funktion _CallEaster aufgerufen
Local $hlblErgebnis = GUICtrlCreateLabel("hier steht danach das Ergebnis", 12, 50, 200)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
;verankert das Label links und oben und fixiert die Größe
;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand
GUICtrlCreateButton('&berechnen (Label links)', 220, 45, 150, 25)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKRIGHT + $GUI_DOCKTOP)
;verankert den Button "Zeigen" rechts oben und fixiert die Größe
;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand
GUICtrlSetOnEvent(-1, '_CallEasterQ')
GUICtrlCreateButton('&in ListView', 220, 80, 150, 25)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKRIGHT + $GUI_DOCKTOP)
GUICtrlSetOnEvent(-1, '_CallEasterA')
GUICtrlCreateButton('Be&enden', 220, 115, 150, 25)
GUICtrlSetOnEvent(-1, '_END')
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKRIGHT + $GUI_DOCKTOP)
$hlstvwHoly = GUICtrlCreateListView("Feiertag | Datum ", 12, 80, 200, 140,$LVS_REPORT,$LVS_EX_GRIDLINES)
GUICtrlSetResizing($hlstvwHoly, $GUI_DOCKBORDERS)
;verankert das Listview per Namen an allen Ecken, alle Größenänderungen
;der Abstand nach Links,rechts,oben und unten bleibt immer gleich
GUICtrlSetState($hlstvwHoly, $GUI_HIDE + $GUI_DISABLE)
GUICtrlCreateGraphic(0, 230, 400, 2, $SS_BLACKRECT)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKRIGHT + $GUI_DOCKLEFT + $GUI_DOCKBOTTOM)
Global $hStatus = GUICtrlCreateLabel("", 5, 235, 400, 25)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKRIGHT + $GUI_DOCKLEFT + $GUI_DOCKBOTTOM)
;verankert das Label Links, rechts und unten; fixiert die Höhe
;beim Resizen bleibt es dadurch auf seiner Position und ändert nur die Breite wird angepasst
GUISetState()
While 1
Sleep(120)
WEnd
Func _End()
GUIDelete($hMainGui)
Exit
EndFunc ;==>_End
Func _CallEaster()
Local $iYear, $iDay
GUICtrlSetState($hlstvwHoly, $GUI_HIDE + $GUI_DISABLE)
;if $hlstvwHoly<>0 Then
; GUICtrlDelete($hlstvwHoly)
; $hlstvwHoly=0
;EndIf
$iYear = GUICtrlRead($hedtYear)
If $iYear = "" Then $iYear = "0"
If $iYear < 1582 Then
GUICtrlSetData($hlblErgebnis, "")
GUICtrlSetData($hStatus, "Das Jahr muss größer als 1582 sein! (Kalenderreform)")
Return ;_getHolyDay liefert vorher immer den gleichen Wert , ab 1583 sind die Werte auch sinnvoll
EndIf
GUICtrlSetData($hStatus, "")
$iDay = _Easter($iYear, False, 'Osterberechnung für Jahr: ' & $iYear, $hMainGui, $WS_VSCROLL)
;zeigt die eingebaut GUI in :Easter
GUICtrlSetData($hlblErgebnis, "Ostersonntag ist der " & $iDay & ".Tag im Jahr " & $iYear)
;$hlblErgebnis wird upgedatet
Opt('GuiEventOptions',1)
EndFunc ;==>_CallEaster
Func _CallEasterQ()
Local $iOS, $iYear
GUICtrlSetState($hlstvwHoly, $GUI_HIDE + $GUI_DISABLE)
;if $hlstvwHoly<>0 Then
; GUICtrlDelete($hlstvwHoly)
; $hlstvwHoly=0
;EndIf
$iYear = GUICtrlRead($hedtYear)
If $iYear = "" Then $iYear = "0"
If $iYear = "" Then $iYear = "0"
$iOS = _Easter($iYear, '' & $iYear, True)
;ruft nur die Anzahl der Tage (1.Jan =1) ab und speichert weist diese der Variablen $iOS zu
GUICtrlSetData($hlblErgebnis, "Ostersonntag ist der " & $iOS & ".Tag im Jahr " & $iYear)
;dem Steuerelement mit der ID:$hlblErgebnis wird der Wert der Variablen $iOS zugewiesen
if $iYear<1582 then GUICtrlSetData($hStatus, "Der Tag entspricht unserem heutigen Kalender!")
EndFunc ;==>_CallEasterQ
Func _CallEasterA()
Local $iOS, $iYear
$iYear = GUICtrlRead($hedtYear)
If $iYear = "" Then $iYear = "0"
If $iYear < 1582 Then
GUICtrlSetData($hlblErgebnis, "")
GUICtrlSetData($hStatus, "Das Jahr muss größer als 1582 sein! (Kalenderreform)")
Return ;_getHolyDay liefert vorher immer den gleichen Wert , ab 1583 sind die Werte auch sinnvoll
EndIf
GUICtrlSetData($hStatus, "")
;$hlstvwHoly=GUICtrlCreateListView("Feiertag | Datum ",5, 75, 200, 200)
;GUICtrlSetResizing($hlstvwHoly, $GUI_DOCKBORDERS)
_GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($hlstvwHoly))
;alle Einträhe im ListView werden gelöscht
GUICtrlSetState($hlstvwHoly, $GUI_SHOW + $GUI_ENABLE)
$iOS = _Easter($iYear, 'Osterberechnung für Jahr: ' & $iYear, True)
;ruft nur die Tageszahl ab
GUICtrlSetData($hlblErgebnis, "Ostersonntag ist der " & $iOS & ".Tag im Jahr " & $iYear)
GUICtrlCreateListViewItem(_getHolyday("Karfreitag:|", $iOS - 2, $iYear), $hlstvwHoly)
;fügt der Listview di mit Hilfe der in $hlstvwHoly gesoeicherten ID angesprochen werden kann
;mit dem zurückgegbenen Wert von _getHolyday($sHT,$iDate,$iYear) einen Listeneintrag hinzu
;der Separator ist kann in $sHT entahlten sein, wenn nicht wird er angehängt
GUICtrlCreateListViewItem(_getHolyday("Ostersamstag:|", $iOS - 1, $iYear), $hlstvwHoly)
GUICtrlCreateListViewItem(_getHolyday("Ostersontag:|", $iOS, $iYear), $hlstvwHoly)
GUICtrlCreateListViewItem(_getHolyday("Ostermontag:|", $iOS + 1, $iYear), $hlstvwHoly)
GUICtrlCreateListViewItem(_getHolyday("Christi Himmelfahrt:|", $iOS + 39, $iYear), $hlstvwHoly)
GUICtrlCreateListViewItem(_getHolyday("Pfingstsonntag:|", $iOS + 49, $iYear), $hlstvwHoly)
GUICtrlCreateListViewItem(_getHolyday("Pfingstmontag:|", $iOS + 50, $iYear), $hlstvwHoly)
GUICtrlCreateListViewItem(_getHolyday("Fronleichnam:|", $iOS + 60, $iYear), $hlstvwHoly)
EndFunc ;==>_CallEasterA
#cs
Func _PDOWN()
MsgBox(0,"Klick auf ",@GUI_CtrlId)
EndFunc
#ce
-
Hallo
die PHP interne Funktion easter_date() scheint buggy zu sein
ich habe etwas gegoogelt und eine individuelle Funktion gefunden
um den Osersonntag zu einem Jahr zu berechnen (Gaußsche Osterformel)
// ------------------------------------------- function easter_sunday($year) { if($year > 2038 || $year < 1970) { return false; } else { $a = $year % 19; $b = $year % 4; $c = $year % 7; $m = ((8 * ($year / 100) + 13) / 25) - 2; $s = ($year / 100) - ($year / 400) - 2; $M = (15 + $s - $m) % 30; $N = (6 + $s) % 7; $d = ($M + 19 * $a) % 30; if ($d == 29) { $D = 28; } elseif ($d == 28 && $a >= 11) { $D = 27; } else { $D = $d; } $e = (2 * $b + 4 * $c + 6 * $D + $N) % 7; $delta = $D + $e + 1; $easter = gmmktime(0, 0, 0, 3, 21, $year) + $delta * (24 * 3600); return $easter; } } // -------------------------------------------
mit dieser Funktion und dem Aufruf $ostersonntag1 = easter_sunday(2011); scheint es zu stimmen
also taugt die PHP interne Funktion easter_date() nichts !!! ... There is a known bug with easter_date()
Da habe ich noch die andere Oster-Sonntag PHP Funktion gefunden: easter_days()
Ergebnis ist die Anzahl der Tage zwischen dem 21. März und Ostersonntag
das ist aber bischen blöd das wieder umzuwandeln, oder ich stell mich da blöd an :)
$xjahr = 2011; // -------------------------- $yhour = 0; $yminute = 0; $ysecond = 0; ## $ytage = 21; // wird weiter unten berechnet $ymonth = 3; $abstanday = easter_days($xjahr); // Abstand der Tage zu 21. März $ytage = ( 21 + $abstanday ); // --- Wenn Ergebnis >= 31 dann umrechnen und im April = Monat 4 if ($ytage >= 31) { $ytage = ($ytage-31); $ymonth = 4; } // ---- timestamp zum Datum erstellen $tmpzeit = mktime($yhour, $yminute, $ysecond, $ymonth, $ytage, $xjahr); $ostersonntag1 = $tmpzeit; echo "<br />Osersonntag ist am " . date('d.m.Y',$ostersonntag1) . "\r\n";
da fragt sich was schneller ist ... und / oder was sicherer ist
... die individuelle Funktion easter_sunday() oder easter_days()
?
EDIT: (nachtrag Frage)
Fehlen in meiner Liste aus dem ersten Beitrag (in diesem Thema) noch Feiertage?
hab ich welche vergessen?
Beitrag zuletzt geändert: 8.10.2011 22:12:06 von uhrinfo -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage