kostenloser Webspace werbefrei: lima-city


Berechnung bewegliche Feiertage: easter_date()

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    uhrinfo

    uhrinfo hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
    $fxtime = ($ostersonntag1 + ($abstand*3600*24));
    liegen. Hier einmal die Easter.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
    und die aufrufende DemoWEaster.au3:
    #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
  4. Autor dieses Themas

    uhrinfo

    uhrinfo hat kostenlosen Webspace.

    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
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!