Frage

Ich bin relativ neu bei der PHP-Programmierung und läuft in ein interessantes Problem.Ich habe mehrere Suchvorgänge ausprobiert und verschiedene Lösungen gefunden, aber keiner von ihnen passt zu meinem genauen Problem.

Ich habe 2 Datestamps im MySQL-Format (zum Beispiel 2014-04-10 09:00:00).Ich muss den Unterschied in wenigen Minuten zwischen diesen beiden Zeitstempeln kennen, aber müssen die Out-of-Office-Stunden, Wochenenden und Feiertage ausschließen.

zum Beispiel ein Zeitstempel von heute (2014-04-11 14:00:00) und ein Zeitstempel von Montag (2014-04-14 11:00:00) müssen infolge von 390 Minuten zeigen (Arbeitstage sind08.30 bis 18.00 Uhr).

Alle Lösungen auf Steckexchange zeigen die Ergebnisse als Stunden oder Tage, aber ich brauche mehr Genauigkeit.

Vielen Dank im Voraus und Entschuldigung von etwas Unklarem.

War es hilfreich?

Lösung

Verwenden Sie Beispiel:

generasacodicetagpre.

Ausgang:

generasacodicetagpre.

Funktion:

generasacodicetagpre.

Diese Funktion kann kürzer / besser sein;aber das ist jetzt dein Job;)

Wenn Sie Urlaub ausschließen möchten, sehen Sie dieses Beispiel: https://stackoverflow.com/a/19221403/67332

Andere Tipps

I got the answer from here

For PHP >= 5.3.0, use the DatePeriod class. It's unfortunately barely documented.

$start = new DateTime('6/30/2010');
$end = new DateTime('7/6/2010');
$oneday = new DateInterval("P1D");

$days = array();
$data = "7.5";

/* Iterate from $start up to $end+1 day, one day in each iteration.
   We add one day to the $end date, because the DatePeriod only iterates up to,
   not including, the end date. */
foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day) {
    $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */
    if($day_num < 6) { /* weekday */
        $days[$day->format("Y-m-d")] = $data;
    } 
}    
print_r($days);

I found this and converted it in to minutes,

$start = new DateTime('2014-03-03 09:21:30');
$end = new DateTime('2014-03-11 17:23:15');
// otherwise the  end date is excluded (bug?)
$end->modify('+1 day');

$interval = $end->diff($start);

// total days
$days = $interval->days;
$days_inMin = ($interval->d*24*60) + ($interval->h*60) + $interval->i;

// create an iterateable period of date (P1D equates to 1 day)
$period = new DatePeriod($start, new DateInterval('P1D'), $end);

// best stored as array, so you can add more than one
$holidays = array('2014-03-07');

foreach($period as $dt) {
    $curr = $dt->format('D');

    // for the updated question
    if (in_array($dt->format('Y-m-d'), $holidays)) {
       $days--;
       $days_inMin -= (24*60);
    }

    // substract if Saturday or Sunday
    if ($curr == 'Sat' || $curr == 'Sun') {
        $days--;
        $days_inMin -= (24*60);
    }
}

echo 'Days: ' . $days; 
echo '<br>Days in Minutes: ' . $days_inMin . ' min = ' . $days_inMin/(24*60) . ' days';

Edit:

$office_hrs_min = $days_inMin - ($days * (14.5*60));
// as out of 24 only 8.5 hrs are working
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top