PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks. |
 |
|

13-12-2006, 11:25
|
m-werk
Registrierter Benutzer
|
|
Registriert seit: Jan 2006
Beiträge: 168
|
|
so, hab es nun in eine while - schleife gesetzt.
PHP-Code:
$startdatum=mktime(0,0,0,$Monat,$Tag,$Jahr);
$enddatum=mktime(0,0,0,$MonatEnde,$TagEnde,$JahrEnde);
while($startdatum<=$enddatum){
$startdatum++;
$test=date("d.m.Y", $startdatum);
echo "$test<br>";
}
Wenn ich jetzt über das ganze mal nachdenke, fällt mir jetzt noch was dazu ein:
mit folgender funktion lese ich ja die Tage eines Monats heraus:
PHP-Code:
function ArbeitstageErmitteln($Jahr, $Monat, $Tag, $JahrEnde, $MonatEnde, $TagEnde)
{
for($i=1; $i<=date("t", mktime(0, 0, 0, $Monat, $Tag, $Jahr)); $i++)
{
if(date("w", mktime(0, 0, 0, $Monat, $i, $Jahr))!=0 && date("w", mktime(0, 0, 0, $Monat, $i, $Jahr))!=6)
{
$Anzahl++;
}
}
return $Anzahl;
}
So, nun habe ich einen ganz anderen DENK-ANSATZ.
Grund dafür ist, dass ich die Werktage eines Ausgewählten Zeitraumes benötige. Diesen Code habe ich mir jetzt zusammengestellt.
PHP-Code:
$startdatum=mktime(0,0,0,$Monat,$Tag,$Jahr);
$enddatum=mktime(0,0,0,$MonatEnde,$TagEnde,$JahrEnde);
$start_wday = date('w',$startdatum);
$end_wday = date('w',$enddatum);
$weeks = date('W',$enddatum - $startdatum);
$days = date('z',$enddatum - $startdatum);
if($start_wday > $end_wday) {
$w_days = $days - ($weeks * 2);
}
else $w_days = $days - (($weeks - 1) * 2);
//----- FEIERTAGE -----
$faktor=0;
while(true)
{
if(($startdatum+(86400*$faktor))>$enddatum)
{
break;
}
else
{
foreach($feiertage as $feiertag)
{
$feiertag=explode(".",$feiertag);
$feiertag = mktime(0,0,0,$feiertag[1],$feiertag[0],$feiertag[2]);
if(($startdatum+(86400*$faktor))==$feiertag)
{
if(date("l" ,$feiertag)!="Sunday" && date("l" ,$feiertag)!="Saturday")
{
$w_days--;
}
}
}
$faktor++;
}
}
echo "$w_days<br>";
So, ich bekomme jetzt anhand diesen codes einen Wert von 255 heraus.
Es müsste aber 248 sein.
WARUM
Es gibt 260 Werktage. (abzüglich Wochenende)
Wir haben 18 Urlaubstage im Jahr (Österreich)
Davon sind genau 6 Urlaubstag im Jahr 2006, die in ein Wochenende fallen.
12 Urlaubstage sind fürs Jahr 2006 unter der Woche.
Somit müssten die 12 Urlaubstage von den 260 Werktagen abgezählt werden.
Ich komm nicht dahinter.
Geändert von m-werk (13-12-2006 um 11:34 Uhr)
|

13-12-2006, 14:02
|
m-werk
Registrierter Benutzer
|
|
Registriert seit: Jan 2006
Beiträge: 168
|
|
Ich kappier das einfach jetzt nicht mehr. Folgender Code funktioniert, wenn ich jeden Monat einzelln abrechnen lasse, richtig. Da stimmt einfach alles.
Wenn ich aber über das ganze Jahr die Berechnung laufen lasse, stimmt der Wert der wirklichen Werktage nicht.
Ich weiss jetzt einfach nicht mehr weiter.
PHP-Code:
<?php
include("feiertage_rechnen.php");
$Jahr=2006;
$Monat=1;
$Tag=1;
$JahrEnde=2006;
$MonatEnde=12;
$TagEnde=31;
$startdatum=mktime(0,0,0,$Monat,$Tag,$Jahr);
$enddatum=mktime(0,0,0,$MonatEnde,$TagEnde,$JahrEnde);
$date1 = $Jahr."-".$Monat."-".$Tag;
$date2 = $JahrEnde."-".$MonatEnde."-".$TagEnde;
function x($date1, $date2) {
$ts1 = strtotime($date1);
$ts2 = strtotime($date2);
if($ts1 <= 0 || $ts2 <= 0) return false;
if($ts2 < $ts1) {
$f = -1;
list($ts1, $ts2) = array($ts2, $ts1);
}
else {
$f = 1;
}
$ts1 = mktime(3,0,0,date("m", $ts1),date("d", $ts1), date("Y", $ts1));
$ts2 = mktime(3,0,0,date("m", $ts2),date("d", $ts2), date("Y", $ts2));
$wd = 0;
while($ts1 <= $ts2) {
if( date("w", $ts1) != 0 && date("w", $ts1) != 6 ) $wd++;
$ts1 += 86400;
}
return $f * ($wd );
}
$test=x($date1, $date2);
echo "$test"." = Tage abzüglich Wochenenden<br>";
//--- Feiertagsberechnung ---
$faktor=0;
while(true)
{
if(($startdatum+(86400*$faktor))>$enddatum)
{
break;
}
else
{
foreach($feiertage as $feiertag)
{
$feiertag=explode(".",$feiertag);
$feiertag = mktime(0,0,0,$feiertag[1],$feiertag[0],$feiertag[2]);
if(($startdatum+(86400*$faktor))==$feiertag)
{
if(date("w" ,$feiertag)!=0 && date("w" ,$feiertag)!=6)
{
$test--;
}
}
}
$faktor++;
}
}
echo "$test"." = Tage abzüglich Feiertage und Wochenenden<br>";
echo "$faktor"." = Tage im Monat<br>";
?>
Was stimmt da nicht, ich komm nicht drauf.
Es muss bei dieser datumsangabe bei $test=248 herauskommen. Es kommt aber immer 255 Heraus.
Ich weiss jetzt nicht mehr, was da noch falsch sein kann. Wie gesagt, wenn ich bei den Datumsangaben das Monat für Monat mache, dann stimmt die Berechnung.
|

13-12-2006, 16:53
|
jmc
PHP Junior
|
|
Registriert seit: Mar 2006
Beiträge: 868
|
|
PHP-Code:
<?
error_reporting(E_ALL);
/* the dates MUST have the following construction: "01.12.2008" or "1.12.2008"
examplar: getWorkdays("1.12.2006","17.12.2006",$feiertage); */
$feiertage=array("25.12.2006","26.12.2006");
function getWorkdays($start, $end, $holidays){
if(!preg_match("/^\d{1,2}\.\d{1,2}\.\d{1,4}$/",$start) ||
!preg_match("/^\d{1,2}\.\d{1,2}\.\d{1,4}$/",$end)){$error=1;}
if(empty($error)){
$workdays = 0;
$start = explode(".",$start);
$end = explode(".",$end);
$s_d = (int)$start[0];
$s_M = (int)$start[1];
$s_y = (int)$start[2];
$e_d = (int)$end[0];
$e_M = (int)$end[1];
$e_y = (int)$end[2];
$s_t = mktime(3,0,0,$s_M,$s_d,$s_y);
$e_t = mktime(3,0,0,$e_M,$e_d,$e_y);
for($i=0;$i<count($holidays);$i++){
$t_f = explode(".",$holidays[$i]);
$holidays[$i] = mktime(0,0,0,(int)$t_f[1],(int)$t_f[0],(int)$t_f[2]);
}
if($s_t<=$e_t){
for($i=0;$i*86400+$s_t<=$e_t;$i++){
if(!in_array(date("w",$i*86400+$s_t),array(0,6)) && !in_array($i*86400+$s_t,$holidays)){
$workdays++;
}
}
return $workdays;
}else{
echo "invalid input<br>\$start-\$end mustn't be negative";
}
}else{
echo "invalid date construction<br>";
}
}
echo getWorkdays("1.1.2006","31.12.2006",$feiertage);
?>
versuchs mal damit.
Die Feiertage habe ich oben definiert di kannst du natürlich auch streichen und mit einem include einfügen.
Geändert von jmc (14-12-2006 um 14:16 Uhr)
|

14-12-2006, 08:53
|
m-werk
Registrierter Benutzer
|
|
Registriert seit: Jan 2006
Beiträge: 168
|
|
Danke für den Code, hab alles was $holidays war auf $feiertage ausgebessert. Es kommt aber, wenn ich diesen ausführe, immer die Meldung: invalid date construction
da stimmt noch was nicht oder mach ich was falsch?
|

14-12-2006, 09:02
|
m-werk
Registrierter Benutzer
|
|
Registriert seit: Jan 2006
Beiträge: 168
|
|
Naja, vielleicht liegts auch an meiner Feiertags-Datei.
der Code dafür sieht so aus:
PHP-Code:
$Jahr=date("Y");
$neujahr=date("d.m.Y", mktime(0,0,0,1,1,$Jahr));
$h3k=date("d.m.Y", mktime(0,0,0,1,6,$Jahr));
$ostersamstag=date("d.m.Y", mktime(0,0,0,date("m", easter_date($Jahr)),
date("d", easter_date($Jahr))-1, date("Y", easter_date($Jahr))));
$ostern=date ("d.m.Y", mktime(0,0,0,date("m", easter_date($Jahr)),
date("d", easter_date($Jahr)), date("Y", easter_date($Jahr))));
$ostermontag=date("d.m.Y", mktime(0,0,0,date("m", easter_date($Jahr)),
date("d", easter_date($Jahr))+1, date("Y", easter_date($Jahr))));
$christi=date("d.m.Y", mktime(0,0,0,date("m", easter_date($Jahr)),
date("d", easter_date($Jahr))+39, date("Y", easter_date($Jahr))));
$pfingsts=date("d.m.Y", mktime(0,0,0,date("m", easter_date($Jahr)),
date("d", easter_date($Jahr))+49, date("Y", easter_date($Jahr))));
$pfingstm=date("d.m.Y", mktime(0,0,0,date("m", easter_date($Jahr)),
date("d", easter_date($Jahr))+50, date("Y", easter_date($Jahr))));
$fronleich=date("d.m.Y", mktime(0,0,0,date("m", easter_date($Jahr)),
date("d", easter_date($Jahr))+60, date("Y", easter_date($Jahr))));
$staat=date("d.m.Y", mktime(0,0,0,5,1,$Jahr));
$maria=date("d.m.Y", mktime(0,0,0,8,15,$Jahr));
$national=date("d.m.Y", mktime(0,0,0,10,26,$Jahr));
$allerheiligen=date("d.m.Y", mktime(0,0,0,11,1,$Jahr));
$maria2=date("d.m.Y", mktime(0,0,0,12,8,$Jahr));
$heilig=date("d.m.Y", mktime(0,0,0,12,24,$Jahr));
$christ=date("d.m.Y", mktime(0,0,0,12,25,$Jahr));
$stef=date("d.m.Y", mktime(0,0,0,12,26,$Jahr));
$silv=date("d.m.Y", mktime(0,0,0,12,31,$Jahr));
$feiertage=array($neujahr,$h3k,$ostersamstag,$ostern,$ostermontag,$christi,$pfingsts,
$pfingstm,$fronleich,$staat,$maria,$national,$allerheiligen,$maria2,$heilig,
$christ,$stef,$silv);
Kann es sein, dass ich da einen fehler drinn habe?
EDIT:
hab mir erlaubt, den code nochmals hineinzustellen. hab ihn jetzt auch runtergebrochen so dass er nicht zu breit ist.
Ich hoffe, es passt so
Geändert von m-werk (14-12-2006 um 09:44 Uhr)
|

14-12-2006, 14:15
|
jmc
PHP Junior
|
|
Registriert seit: Mar 2006
Beiträge: 868
|
|
das geht so nicht... holidays müssen holidays bleiben. Das ist eine Variabel innerhalb der Funktion. Die Feiertage werden durch den Funktionsaufruf übergeben.
Hier nochmals ein Script
PHP-Code:
<?
error_reporting(E_ALL);
/* the dates MUST have the following construction: "01.12.2008" or "1.12.2008"
examplar: getWorkdays("1.12.2006","17.12.2006"); */
function getWorkdays($start, $end){
if(preg_match("/^\d{1,2}\.\d{1,2}\.\d{1,4}$/",$start) || preg_match("/^\d{1,2}\.\d{1,2}\.\d{1,4}$/",$end)){
$workdays = 0;
$start = explode(".",$start);
$end = explode(".",$end);
$s_d = (int)$start[0];
$s_M = (int)$start[1];
$s_y = (int)$start[2];
$e_d = (int)$end[0];
$e_M = (int)$end[1];
$e_y = (int)$end[2];
if(mktime(0,0,0,$s_M,$s_d,$s_y)<=mktime(0,0,0,$e_M,$e_d,$e_y)){
for($i=0;mktime(0,0,0,$s_M,$i+$s_d,$s_y)<=mktime(0,0,0,$e_M,$e_d,$e_y);$i++){
if(!in_array(date("w",mktime(0,0,0,$s_M,$i+$s_d,$s_y)),array(0,6)) &&
!in_array(mktime(0,0,0,$s_M,$i+$s_d,$s_y),get_holidays(mktime(0,0,0,$s_M,$i+$s_d,$s_y)))){
$workdays++;
}
}
return $workdays;
}else{
return "invalid input<br>\$start-\$end mustn't be negative";
}
}else{
return "invalid date construction<br>";
}
}
function get_holidays($year){
$year = date("Y",$year);
$newyear = mktime(0,0,0,1,1,$year);
$h3k = mktime(0,0,0,1,6,$year);
$ostersamstag = easter_date($year)-86400;
$ostern = easter_date($year);
$ostermontag = easter_date($year)+86400;
$christi = easter_date($year)+39*86400;
$pfingsts = easter_date($year)+49*86400;
$pfingstm = easter_date($year)+50*86400;
$fronleich = easter_date($year)+60*86400;
$staat = mktime(0,0,0,5,1,$year);
$maria = mktime(0,0,0,8,15,$year);
$national = mktime(0,0,0,10,26,$year);
$allerheiligen = mktime(0,0,0,11,1,$year);
$maria2 = mktime(0,0,0,12,8,$year);
$heilig = mktime(0,0,0,12,24,$year);
$christ = mktime(0,0,0,12,25,$year);
$stef = mktime(0,0,0,12,26,$year);
$silv = mktime(0,0,0,12,31,$year);
return array($newyear,$h3k,$ostersamstag,$ostern,$ostermontag,$christi,$pfingsts,$pfingstm,
$fronleich,$staat,$maria,$national,$allerheiligen,$maria2,$heilig,$christ,$stef,$silv);
}
echo getWorkdays("1.1.2006","31.12.2006"); // Ausgabe 248
?>
PS: Backslashes verschwinden im FOrum. Drücke auf Zitat um den ganzen Code zu erhalten.
Geändert von jmc (14-12-2006 um 14:21 Uhr)
|

14-12-2006, 15:16
|
m-werk
Registrierter Benutzer
|
|
Registriert seit: Jan 2006
Beiträge: 168
|
|
SPITZE, GENAU DAS WASS ICH WOLLTE.
DAS FUNKTIONIERT JETZT.
DANKE
|

14-12-2006, 16:05
|
m-werk
Registrierter Benutzer
|
|
Registriert seit: Jan 2006
Beiträge: 168
|
|
Eine kleinigkeit brächte ich da noch.
Wie kriege ich jetzt aus der holiday funktion die Tage aufgelistet am Schirm?
hab schon einiges versucht. Komm nicht dahinter.
|

14-12-2006, 16:07
|
jmc
PHP Junior
|
|
Registriert seit: Mar 2006
Beiträge: 868
|
|
alle freien Tage ausser den Sonntagen und Samstagen, die innerhalb der Zeitspanne sind?
|

14-12-2006, 16:10
|
m-werk
Registrierter Benutzer
|
|
Registriert seit: Jan 2006
Beiträge: 168
|
|
ne, ich bräuchte das Datum. ich möchte das datum der einzellnen Feiertage einerseits vom ganzen Jahr sehen und andererseits möchte ich z.b. nur den $silv sehen.
|

14-12-2006, 16:18
|
jmc
PHP Junior
|
|
Registriert seit: Mar 2006
Beiträge: 868
|
|
PHP-Code:
$array = get_holidays(hier_die_jahreszahl);
for($i=0;$i<count($array);$i++){
$array[$i] = date("D j F Y",$array[$i])
}
print_r($array);
um das Datum der einzelnen rauszufinden müsste ich wissen wofür, damit ich etwas so anpassen kann.
|

14-12-2006, 16:23
|
m-werk
Registrierter Benutzer
|
|
Registriert seit: Jan 2006
Beiträge: 168
|
|
Ich möchte immer das Silvesterdatum auf der Seite angezeigt haben.
Es geht darum:
Ich gebe das Datum ein, wann ein Mitarbeiter in das Unternehmen kommt.
Nun möchte ich immer wissen, wieviele Arbeitstage er bis Jahresende hat.
Ich habe den Code schon so umgebaut, (war nicht viel zu tun, so dass das $start schon mit den richtigen Startdatum, welches ich eingebe, befüllt wird. Ich möchte nicht das Enddatum auch fix hinterlegen, da ich nicht jedes Jahr das Datum ändern möchte.
Darum geht's eigentlich.
|

14-12-2006, 16:26
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 25.236
|
|
Kannst du eigentlich überhaupt irgendwas selber ...?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

14-12-2006, 20:30
|
m-werk
Registrierter Benutzer
|
|
Registriert seit: Jan 2006
Beiträge: 168
|
|
habs gelöst, danke für eure hilfe und unterstützung.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Thema bewerten |
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
Aktuelle PHP Scripte
Homepagetools 2022
Kostenloses Gästebuch und Homepagetools für die eigene Homepage.
Bei GuxDu kann man sich kostenlos die Websitetools auf die vorhandene Website einbauen. Zudem kann man bei GuxDU auch eine eigene Homepage mit 3D Effekten erstellen. GuxDu ist kostenlos.
29.04.2022
freepler | Kategorie: PHP/ Gaestebuch
|
SF-Shopsystem V1.0
Hier haben wir ein einzigartiges Shopsystem in PHP.
Die Anzahl der Artikel ist unbegrenzt, einfach zu bedienen und erklärt sich.
Ausführliche Beschreibung weiter unten.
28.04.2022
Speedcrawler | Kategorie: PHP/ Shops
|
Anzeigen Markt mit PayPal Bezahl System
Anzeigen Markt Script
mit PayPal Bezahl System
Der Benutzer hat die Möglichkeit sofort nach Bezahlung mit PayPal
seine Anzeigen zu schalten, je nach seinem Guthaben.
27.04.2022
Webace_de | Kategorie: PHP/ Anzeigenmarkt
|
Alle PHP Scripte anzeigen
|