Arbeitszeit mit PHP und MySql

Pol

Mitglied
Hallo
Ich möchte einen Eintrag für Arbeitszeit für einen Monat vornehmen.
Ich gebe die Anfangszeit und die Endzeit ein und möchte dass alle dazwischen liegenden Tage eingetragen sind. Ich habe mit dem unten stehenden Code nur die Tage eintragen können und wäre für diese Erweiterungsvorschläge sehr froh.

Beispiel
Anfangszeit: 01.02.2013 08:30
Endzeit: 28.02.2013 17:30

Dann müssen folgende Arbeitstage eingetragen werden:
01.02.2013 08:30 01.02.2013 17:30
04.02.2013 08:30 04.02.2013 17:30
05.02.2013 08:30 05.02.2013 17:30
....

Mein bicheriger Code
PHP:
$startDate = $rsnew["starttime"];  
$endDate =  $rsnew["endtime"];      
                                   
// Convert to UNIX timestamps                          
$currentTime = strtotime($startDate);
$endTime = strtotime($endDate);
                                                        
// Loop until we reach the last day
$result = array();                          
while ($currentTime <= $endTime) {
  if (date('N', $currentTime) < 6) {
    $result[] = date('Y-m-d', $currentTime);
  }
  $currentTime = strtotime('+1 day', $currentTime);
  echo  "Hallo" .$currentTime;   
}  
                      
// start insertion        
foreach($result as $value)        
{                                          
                                                     
$MyResult = ew_Execute("INSERT INTO dates (date) VALUES ('".$value."')");
 echo  "Hallo" .$value;                                                         
}

Pol
 
Zuletzt bearbeitet von einem Moderator:
Werden die Anfangs- und Endzeiten nicht in getrennten Feldern gespeichert?

Idealerweise hätte die Tabelle 3 Felder: datum, anfangs_zeit und end_zeit.
 
Zuletzt bearbeitet:
Und wenns nicht getrennt hast, dann muss man es halt aufteilen
PHP:
//Anfangszeit: 01.02.2013 08:30
//Endzeit: 28.02.2013 17:30

define('C_DATETIME_FORMAT', 'd.m.Y H:i');
define('C_DATE_FORMAT','d.m.Y');
define('C_TIME_FORMAT', 'H:i');

$start = DateTime::createFromFormat(C_DATETIME_FORMAT, '01.02.2013 08:30');
$end = DateTime::createFromFormat(C_DATETIME_FORMAT, '28.02.2013 17:30');

//Trenne Zeit und Datum
$startDate = DateTime::createFromFormat(C_DATE_FORMAT, $start->format(C_DATE_FORMAT));
$startTime = DateTime::createFromFormat(C_TIME_FORMAT, $start->format(C_TIME_FORMAT));

$endDate = DateTime::createFromFormat(C_DATE_FORMAT, $end->format(C_DATE_FORMAT));
$endTime = DateTime::createFromFormat(C_TIME_FORMAT, $end->format(C_TIME_FORMAT));

//Interval defineren +1Tag
$interval = new DateInterval('P1D');
//Die Periode erstellen 
$period = new DatePeriod($startDate, $interval, $endDate);

//Die ganez Periode durchgehen
$dateStrings = array();
foreach($period as $date){
    //Prüfen ons ein Arbeitstag ist
    if($date->format('N') < 6){
        //Tagesanfang defineren
        $dayStart = $date->setTime($startTime->format('H'), $startTime->format('i'));
        //Tagesende definieren
        $dayEnd = $date->setTime($endTime->format('H'), $endTime->format('i'));
        //TODO: mach mit den Informationen was du willst
        $dateStrings[] = sprintf('%s: %s - %s', $date->format('l'), $dayStart->format(C_DATETIME_FORMAT), $dayEnd->format(C_TIME_FORMAT)); 
    }else{
        //TODO: Weekend
    }
}
echo implode('<br />', $dateStrings);

Ausgabe
Code:
Friday: 01.02.2013 17:30 - 17:30
Monday: 04.02.2013 17:30 - 17:30
Tuesday: 05.02.2013 17:30 - 17:30
Wednesday: 06.02.2013 17:30 - 17:30
Thursday: 07.02.2013 17:30 - 17:30
Friday: 08.02.2013 17:30 - 17:30
Monday: 11.02.2013 17:30 - 17:30
Tuesday: 12.02.2013 17:30 - 17:30
Wednesday: 13.02.2013 17:30 - 17:30
Thursday: 14.02.2013 17:30 - 17:30
Friday: 15.02.2013 17:30 - 17:30
Monday: 18.02.2013 17:30 - 17:30
Tuesday: 19.02.2013 17:30 - 17:30
Wednesday: 20.02.2013 17:30 - 17:30
Thursday: 21.02.2013 17:30 - 17:30
Friday: 22.02.2013 17:30 - 17:30
Monday: 25.02.2013 17:30 - 17:30
Tuesday: 26.02.2013 17:30 - 17:30
Wednesday: 27.02.2013 17:30 - 17:30

... und somit hab ich gleich ein neues Beispiel für mein Wiki *g*
 
Hello Yaslaw
Super, ich danke dir. In der Output sehe ich aber nur den Endzeit. Wo soll ich ändern dass der Tag mit start- und endzeit ist?
Danke
Pol
 
Stimmt. Er scheint da eine Referenz zu machen so dass das $dayStart mit $dayEnd überschrieben wird. Nunja, dann machen wir hat aus dem Objekt $dayStart bereits ein formatierter String

PHP:
foreach($period as $date){
    //Prüfen ons ein Arbeitstag ist
    if($date->format('N') < 6){
        //Tagesanfang defineren (bereits als formatierter String)
        $dayStart = $date->setTime($startTime->format('H'), $startTime->format('i'))->format(C_DATETIME_FORMAT);
        //Tagesende definieren (bereits als formatierter String)
        $dayEnd = $date->setTime($endTime->format('H'), $endTime->format('i'))->format(C_TIME_FORMAT);
        //TODO: mach mit den Informationen was du willst
        $dateStrings[] = sprintf('%s: %s - %s', $date->format('l'), $dayStart, $dayEnd); 
    }else{
        //TODO: Weekend
    }
}

oder man clont die Objekte. Auf diese Art kann man mit den Objekten weiterarbeiten. ist mMn sauberer
PHP:
foreach($period as $date){
    //Prüfen ons ein Arbeitstag ist
    if($date->format('N') < 6){
        //Tagesanfang defineren
        $dayStart = clone $date->setTime($startTime->format('H'), $startTime->format('i'));
        //Tagesende definieren
        $dayEnd = clone $date->setTime($endTime->format('H'), $endTime->format('i'));
        //TODO: mach mit den Informationen was du willst
        $dateStrings[] = sprintf('%s: %s - %s', $date->format('l'), $dayStart->format(C_DATETIME_FORMAT), $dayEnd->format(C_TIME_FORMAT)); 
    }else{
        //TODO: Weekend
    }
}
 
Hallo Yaslaw
danke sehr. Ich werde demnächst testen. Yaslaw, hast du mir auch den Code für die Eingabe ins MySql? Sorry, falls du gerade hast?

Pol
 
Währe kein Problem, wenn ich wüsste in welcher Form die Informationen in die DB kommen.
Als ein Textfeld? Oder 2 Datetime-Fielder? Oder speicherst du 2 Integer als timestamp?
 
Dann könnte das so aussehen
PHP:
define('C_MYSQL_DATETIME_FORMAT', 'Y-m-d H:i:s');
.....
foreach($period as $date){
    //Prüfen ons ein Arbeitstag ist
    if($date->format('N') < 6){
        //Tagesanfang defineren
        $dayStart = clone $date->setTime($startTime->format('H'), $startTime->format('i'));
        //Tagesende definieren
        $dayEnd = clone $date->setTime($endTime->format('H'), $endTime->format('i'));
        //In die DB eintragen
        $sql = 'INSERT INTO my_table (startdate, enddate) VALUES("%s", "%s");';
        $sql = sprintf($sql, $dayStart->format(C_MYSQL_DATETIME_FORMAT), $dayEnd->format(C_MYSQL_DATETIME_FORMAT));
        mysql_query($sql);
    }else{
        //TODO: Weekend
    }
}
 
Zurück