Autor Zpráva
jtfcobra
Profil
Dobrý den potřeboval bych v PHP udělat rozpočítání hodin jen do pracovních dnů poradíte jak na to?

Například mám 80 hodin a potřebuji to dostat do pracovních dnů těch je cca 20 (4hodiny deně)

<?php
function cesky_mesic($mesic) {
    static $nazvy = array(1 => 'leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec');
    return $nazvy[$mesic];
}

echo cesky_mesic(date("n")) . "\n";

function cesky_den($den) {
    static $nazvy = array('neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota');
    return $nazvy[$den];
}

echo cesky_den(date("w")) . "\n";
?>
Tomášeek
Profil
jtfcobra:
No, popravdě nerozumím tomu, proč máš vytvořené funkce den/měsíc česky, ty s dotazem přeci nesouvisí. Jinými slovy, nemáš zatím nic, že?

Píšeš o 80 hodinách a 20 dnech? Odkdy (do kdy) se má těch 20 dní počítat? Je to 20 dní v kuse? Co státní svátky? Pokud nic z toho řešit nechceš/nepotřebuješ, tak si jen postupnou iterací procházej měsíc po měsíci a v nich jednotlivé dny, v Po-Pá si přičti jedničku a po dvacátém záznamu iteraci ukonči.
jtfcobra
Profil
Stačí mi dny po - pá
Tomášeek
Profil
jtfcobra:
A problém je tedy kde? Postup k řešení jsem ti popsal výše, kód za tebe psát nebudu. Jen to tvrzení lehce doplním/upřesním, a sice:

Postupnou iterací procházej měsíc po měsíci a v nich jednotlivé dny, počínaje dnem, který považuješ za první pracovní (pokud to bude 3. listopadu, nebudeš procházet měsíce od ledna, ale začneš listopadem), v Po-Pá si přičti jedničku a po dvacátém záznamu iteraci ukonči.
jtfcobra
Profil
Mam to takle:

jen mi jeste nejdou ty ceske dny a musim dopredu spocitat kolik je na den

<?php
$rok=2016;
$mesic=1;
$pocethodin=85;
$nastavhodiny=4.0;
$number = cal_days_in_month(CAL_GREGORIAN, $mesic, $rok); // 31
echo 'Pocet dni '.$number.'</br>';

function cesky_den($den) {
    static $nazvy = array('neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota');
    return $nazvy[$den];
}

$pracovnidny=0;
for($d=1; $d<=$number; $d++)
{
    $time=mktime(12, 0, 0, $mesic, $d, $rok);
    if (date('m', $time)==date('m'))
        $datum=date('Y-m-d', $time);
        $nazevden=date('D', $time);
        if ($nazevden=='Sun' || $nazevden=='Sat') {} else {$pracovnidny=$pracovnidny+1;  echo $datum.' nazev dne '.$nazevden.' odpracovano '.$nastavhodiny.' hodin</br>';};
}
$vysledek=$pocethodin/$pracovnidny;
echo 'Pocet pracovnich dni: '.$pracovnidny.' , celkove '.$vysledek.' na den';
?>
Tomášeek
Profil
jtfcobra:
jen mi jeste nejdou ty ceske dny
To bude tím, že tu funkci nikde nevoláš.

musim dopredu spocitat kolik je na den
Tomu moc nerozumím. Když chceš něco popsat, zkus to lépe a srozumitelněji. Zároveň místo "tohle mám, nějak se tím proberte" doplň, co to aktuálně dělá a co by to ještě dělat mělo.

Celkově to řešení je takové zatím nic moc, ještě se trochu snaž. Třeba to vůbec neřeší hodiny napříč více měsíci.

Na 21. řádku máš nějakou divokou konstrukci s prázdným tělem podmínky, lepší by bylo

if (!in_array($nazevden, array('Sat', 'Sun'))) {
    // ...
}
Keeehi
Profil
jtfcobra:
Pokud chceš zjistit, kolik je dní po-pá v měsíci, pak můžeš použít
function get_number_of_week_days($month, $year) {
    $lastday = date("t", mktime(0, 0, 0, $month, 1, $year));
    $weekdays = 20;
    for ($day = 29; $day <= $lastday; $day++) {
        if (date("N", mktime(0, 0, 0, $month, $day, $year)) < 6) {
            $weekdays++;
        }   
    }
    return $weekdays;
}
jtfcobra
Profil
Udelal jsem to takle jeste doladim kod jen nevim jak pricist cas treba 9:00 + 4 hodiny ?

<?php
$rok=2016;
$mesic=1;
$pocethodin=85;
$jmeno='Neznamy';
$number = cal_days_in_month(CAL_GREGORIAN, $mesic, $rok); // 31
echo 'Pocet dni '.$number.'</br></br>';

$pracovnidnyy=0;
// Spocita hodiny
for($k=1; $k<=$number; $k++)
{
    $time=mktime(12, 0, 0, $mesic, $k, $rok);
    if (date('m', $time)==date('m'))
        $datum=date('Y-m-d', $time);
        $nazevden=date('D', $time);
        if ($nazevden=='Sun' || $nazevden=='Sat') {} else {$pracovnidnyy=$pracovnidnyy+1;};
};
$nastavhodiny=$pocethodin/$pracovnidnyy;

// Vypise pracovni dny
for($d=1; $d<=$number; $d++)
{
    $time=mktime(12, 0, 0, $mesic, $d, $rok);
    if (date('m', $time)==date('m'))
        $datum=date('Y-m-d', $time);
        $nazevden=date('D', $time);
        if ($nazevden=='Mon' ) {$nazevdencesky='Pondeli';};
        if ($nazevden=='Tue' ) {$nazevdencesky='Utery';};
        if ($nazevden=='Wed' ) {$nazevdencesky='Streda';};
        if ($nazevden=='Thu' ) {$nazevdencesky='Ctrvtek';};
        if ($nazevden=='Fri' ) {$nazevdencesky='Patek';};
        if ($nazevden=='Sun' || $nazevden=='Sat') {} else { echo 'Jmeno zamestnance: '.$jmeno.' '.$datum.',prichod 9:00, nazev dne '.$nazevdencesky.' odpracovano '.$nastavhodiny.' hodin</br>';};
}


echo '</br>Pocet pracovnich dni: '.$pracovnidnyy.' , celkove '.$nastavhodiny.' na den';
?>


Vysledek
Pocet dni 31

Jmeno zamestnance: Neznamy 2016-01-01,prichod 9:00, nazev dne Patek odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-04,prichod 9:00, nazev dne Pondeli odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-05,prichod 9:00, nazev dne Utery odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-06,prichod 9:00, nazev dne Streda odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-07,prichod 9:00, nazev dne Ctrvtek odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-08,prichod 9:00, nazev dne Patek odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-11,prichod 9:00, nazev dne Pondeli odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-12,prichod 9:00, nazev dne Utery odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-13,prichod 9:00, nazev dne Streda odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-14,prichod 9:00, nazev dne Ctrvtek odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-15,prichod 9:00, nazev dne Patek odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-18,prichod 9:00, nazev dne Pondeli odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-19,prichod 9:00, nazev dne Utery odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-20,prichod 9:00, nazev dne Streda odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-21,prichod 9:00, nazev dne Ctrvtek odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-22,prichod 9:00, nazev dne Patek odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-25,prichod 9:00, nazev dne Pondeli odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-26,prichod 9:00, nazev dne Utery odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-27,prichod 9:00, nazev dne Streda odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-28,prichod 9:00, nazev dne Ctrvtek odpracovano 4.047619047619 hodin
Jmeno zamestnance: Neznamy 2016-01-29,prichod 9:00, nazev dne Patek odpracovano 4.047619047619 hodin

Pocet pracovnich dni: 21 , celkove 4.047619047619 na den 
Keeehi
Profil
jtfcobra:
Když to lehce učešeš, tak to může vypadat takto
<?php
$rok=2016;
$mesic=2;
$pocethodin=85;
$jmeno='Neznamy';

function get_number_of_week_days($month, $year) {
    $lastday = date("t", mktime(0, 0, 0, $month, 1, $year));
    $weekdays = 20;
    for ($day = 29; $day <= $lastday; $day++) {
        if (date("N", mktime(0, 0, 0, $month, $day, $year)) < 6) {
            $weekdays++;
        }   
    }
    return $weekdays;
}

$number = cal_days_in_month(CAL_GREGORIAN, $mesic, $rok); // 31
echo 'Pocet dni '.$number.'</br></br>';
 
$pracovnidny = get_number_of_week_days($mesic, $rok);
$nastavhodiny = $pocethodin / $pracovnidny;

for($d=1; $d<=$number; $d++) {
    $time=mktime(12, 0, 0, $mesic, $d, $rok);
    $den = date('w', $time);
    $nazevdencesky = ['Nedělě', 'Pondělí', 'Úterý', 'Středa', 'Čtvrtek', 'Pátek', 'Sobota'][$den];

    if ($den != 0 && $den != 6) {
        echo 'Jmeno zamestnance: '.$jmeno.' '.date('Y-m-d', $time).',prichod 9:00, nazev dne '.$nazevdencesky.' odpracovano '.$nastavhodiny.' hodin</br>';
    }
}

echo '</br>Pocet pracovnich dni: '.$pracovnidny.' , celkove '.$nastavhodiny.' na den';
?>
jtfcobra
Profil
jediny co mam problem je ten odchod

Přichod je vždy v 9:00 + $nastavhodiny ale vychazi to samosrejmne kravina
Keeehi
Profil
jtfcobra:
Jako že ten čas 4.04761.... hodin chceš přičíst k 9:00 a zjistit tak konec?
<?php
$nastavhodiny=4.047619047619;
$intervalMinutes = (int)(60 * $nastavhodiny);
$start = new DateTime('9:00');
$start->add(new DateInterval("PT{$intervalMinutes}M"));
echo $start->format('H:i');

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: