php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


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.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #16 (permalink)  
Alt 13-12-2006, 11:25
m-werk
 Registrierter Benutzer
Links : Onlinestatus : m-werk ist offline
Registriert seit: Jan 2006
Beiträge: 168
m-werk ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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(000$Monat$Tag$Jahr)); $i++)
    {
    if(
date("w"mktime(000$Monat$i$Jahr))!=&& date("w"mktime(000$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)
Mit Zitat antworten
  #17 (permalink)  
Alt 13-12-2006, 14:02
m-werk
 Registrierter Benutzer
Links : Onlinestatus : m-werk ist offline
Registriert seit: Jan 2006
Beiträge: 168
m-werk ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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 <= || $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) != && date("w"$ts1) != $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)!=&& 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.
Mit Zitat antworten
  #18 (permalink)  
Alt 13-12-2006, 16:53
jmc
 PHP Junior
Links : Onlinestatus : jmc ist offline
Registriert seit: Mar 2006
Beiträge: 868
jmc befindet sich auf einem aufstrebenden Ast
Standard

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)
Mit Zitat antworten
  #19 (permalink)  
Alt 14-12-2006, 08:53
m-werk
 Registrierter Benutzer
Links : Onlinestatus : m-werk ist offline
Registriert seit: Jan 2006
Beiträge: 168
m-werk ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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?
Mit Zitat antworten
  #20 (permalink)  
Alt 14-12-2006, 09:02
m-werk
 Registrierter Benutzer
Links : Onlinestatus : m-werk ist offline
Registriert seit: Jan 2006
Beiträge: 168
m-werk ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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))-1date("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))+1date("Y"easter_date($Jahr))));
$christi=date("d.m.Y"mktime(0,0,0,date("m"easter_date($Jahr)),
         
date("d"easter_date($Jahr))+39date("Y"easter_date($Jahr))));
$pfingsts=date("d.m.Y"mktime(0,0,0,date("m"easter_date($Jahr)), 
          
date("d"easter_date($Jahr))+49date("Y"easter_date($Jahr))));
$pfingstm=date("d.m.Y"mktime(0,0,0,date("m"easter_date($Jahr)), 
          
date("d"easter_date($Jahr))+50date("Y"easter_date($Jahr))));
$fronleich=date("d.m.Y"mktime(0,0,0,date("m"easter_date($Jahr)),
           
date("d"easter_date($Jahr))+60date("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)
Mit Zitat antworten
  #21 (permalink)  
Alt 14-12-2006, 14:15
jmc
 PHP Junior
Links : Onlinestatus : jmc ist offline
Registriert seit: Mar 2006
Beiträge: 868
jmc befindet sich auf einem aufstrebenden Ast
Standard

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)
Mit Zitat antworten
  #22 (permalink)  
Alt 14-12-2006, 15:16
m-werk
 Registrierter Benutzer
Links : Onlinestatus : m-werk ist offline
Registriert seit: Jan 2006
Beiträge: 168
m-werk ist zur Zeit noch ein unbeschriebenes Blatt
Thumbs up

SPITZE, GENAU DAS WASS ICH WOLLTE.

DAS FUNKTIONIERT JETZT.


DANKE
Mit Zitat antworten
  #23 (permalink)  
Alt 14-12-2006, 16:05
m-werk
 Registrierter Benutzer
Links : Onlinestatus : m-werk ist offline
Registriert seit: Jan 2006
Beiträge: 168
m-werk ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #24 (permalink)  
Alt 14-12-2006, 16:07
jmc
 PHP Junior
Links : Onlinestatus : jmc ist offline
Registriert seit: Mar 2006
Beiträge: 868
jmc befindet sich auf einem aufstrebenden Ast
Standard

alle freien Tage ausser den Sonntagen und Samstagen, die innerhalb der Zeitspanne sind?
Mit Zitat antworten
  #25 (permalink)  
Alt 14-12-2006, 16:10
m-werk
 Registrierter Benutzer
Links : Onlinestatus : m-werk ist offline
Registriert seit: Jan 2006
Beiträge: 168
m-werk ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #26 (permalink)  
Alt 14-12-2006, 16:18
jmc
 PHP Junior
Links : Onlinestatus : jmc ist offline
Registriert seit: Mar 2006
Beiträge: 868
jmc befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #27 (permalink)  
Alt 14-12-2006, 16:23
m-werk
 Registrierter Benutzer
Links : Onlinestatus : m-werk ist offline
Registriert seit: Jan 2006
Beiträge: 168
m-werk ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #28 (permalink)  
Alt 14-12-2006, 16:26
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Kannst du eigentlich überhaupt irgendwas selber ...?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #29 (permalink)  
Alt 14-12-2006, 20:30
m-werk
 Registrierter Benutzer
Links : Onlinestatus : m-werk ist offline
Registriert seit: Jan 2006
Beiträge: 168
m-werk ist zur Zeit noch ein unbeschriebenes Blatt
Standard

habs gelöst, danke für eure hilfe und unterstützung.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

Newsmanager

Der Newsmanager ist ein Newssystem und Newsletter in einem. Mit WYSIWYG Editor und E-Mail import aus einer bestehenden MySql Datenbank sowie dynamische Kategorien / Themen Filter.

11.09.2019 Stephan_1972 | Kategorie: PHP/ News
Modelmanager

Der Modelmanager ist ein Webtool für Fotografen, kann als komplette Homepage oder als Webtool installiert werden.

11.09.2019 Stephan_1972 | Kategorie: PHP/ Webservice
ContentLion - Open Source CMS ansehen ContentLion - Open Source CMS

ContentLion ist ein in PHP geschriebenes CMS, bei dem man Seiten, Einstellungen usw. in Ordnern lagern kann

22.08.2019 stevieswebsite2 | Kategorie: PHP/ CMS
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:20 Uhr.