Zadejte hledaný výraz...

Výpočet dátumu a času dodania

Tomáš
verified
rating uzivatele
(27 hodnocení)
9. 3. 2014 15:57:41
Riešim nasledujúci problém:
Mám zadané určité pracovné hodiny, pondelok až štvrtok sa pracuje od 8:00 do 13:00 a od 14:00 do 18:00, v piatok od 8:00 do 13:00 a cez víkend sa nepracuje vôbec.
Potrebujem vyriešiť to, aby som vedel zákazníkovi vypísať, kedy si môže prísť vyzdvihnúť objednaný produkt, pričom si ho môže vyzdvihnúť po 4 pracovných hodinách od objednávky.
Príklad: zákazník si objedná tovar v pondelok o 12:00, systém by mu mal vypísať, že si po tovar môže prísť v pondelok po 17:00 (pracovné hodiny od 12:00 do 13:00 a 14:00 do 17:00, spolu 4 hodiny)
Príklad č.2: zákazník si tovar objedná v stredu o 16:00, systém by mu mal vypísať, že si po tovar môže prísť vo štvrtok po 10:00 (pracovné hodiny streda od 16:00 do 18:00, štvrtok 8:00 až 10:00)
Viete mi poradiť, ako na to? Teda ako pomocou PHP na základe aktuálneho dňa a času vypočítať, kedy uplynú 4 pracovné hodiny na základe zadefinovaných pracovných hodín.
Napadlo ma pomocou cyklu pripočítavať k aktuálnemu času minúty dovtedy, kým nepripočítam 240 pracovných minút, no neviem prísť na spôsob, ako zistiť, či daná minúta daného dňa je pracovná alebo nie.
Ďakujem za rady.
9. 3. 2014 15:57:41
https://webtrh.cz/diskuse/vypocet-datumu-a-casu-dodania#reply1003887
wizardd
verified
rating uzivatele
(1 hodnocení)
9. 3. 2014 19:21:28
Dal bych jednotlivé dny do pole ve tvaru array(po=>array(od1=>10:00, do1=>12 , od2=>13:00, do2=>14), ut=>array(...)).
Na začátku si dáš do nějaké proměnné ty 4 hodny (možná v minutách). No a když ti přijde objednávka, tak vezmeš hodiny z pole pro aktuální den, zkusíš, jestli stihneš ty čtyři hodiny ještě dnes a pokud ne, odečteš od svých 4 hodin v proměnné to co stihneš ještě dnes a přejdeš na druhej den. A tak bych to dělal do tý doby než najdu den, kdy to stihnu. Výslednej čas bude rovnej času z pole od + to, co ti zbyde v té proměnné,kde na začátku byly ty 4 hodiny. Možná to není nejefektivnější, ale fungovat by to mělo.
9. 3. 2014 19:21:28
https://webtrh.cz/diskuse/vypocet-datumu-a-casu-dodania#reply1003886
johanek
verified
rating uzivatele
9. 3. 2014 19:31:28
Urcite to jde vymyslet lip a je dost mozny, ze jsem nekde udelal chybu. Vubec jsem to nezkousel, takze nerucim za funkcnost :D
Jeste bys, ale mel resit statni svatky atd...
9. 3. 2014 19:31:28
https://webtrh.cz/diskuse/vypocet-datumu-a-casu-dodania#reply1003885
Tomáš
verified
rating uzivatele
(27 hodnocení)
9. 3. 2014 19:58:20
Nie je to celkom ono, jednak to nefunguje vždy správne a jednak ide o to, že potrebujem, aby tie časy od do boli ľahšie menitelné a v tomto prípade mám pocit, že tento kód je robený skôr na mieru mnou zadaným pracovným časom, no tie musia byť meniteľné a teda v prípade iných časov by asi tento skript nefungoval správne... alebo sa mýlim?
Napsal johanek;1065682
Urcite to jde vymyslet lip a je dost mozny, ze jsem nekde udelal chybu. Vubec jsem to nezkousel, takze nerucim za funkcnost :D
Jeste bys, ale mel resit statni svatky atd...
9. 3. 2014 19:58:20
https://webtrh.cz/diskuse/vypocet-datumu-a-casu-dodania#reply1003884
johanek
verified
rating uzivatele
9. 3. 2014 20:08:07
To, ze to nefunguje vzdy spravne je mozny, protoze jsem to nezkousel.
Tak je to udelany podle zadanych kriterii, nikde jsem se nedocetl, ze to ma byt menitelny, nicmene i podobnym zpusobem se to da udelat na jednodussi zmenu, ale to uz se mne vazne nechce predelavat.
9. 3. 2014 20:08:07
https://webtrh.cz/diskuse/vypocet-datumu-a-casu-dodania#reply1003883
iTerminator
verified
rating uzivatele
(9 hodnocení)
9. 3. 2014 20:21:55
Rychlovka
9. 3. 2014 20:21:55
https://webtrh.cz/diskuse/vypocet-datumu-a-casu-dodania#reply1003882
Tomáš
verified
rating uzivatele
(27 hodnocení)
9. 3. 2014 20:25:30
Otváracie hodiny som si zadal do arrayu takto:
Skúsil som také niečo, že som si toto pole pretransformoval na pole minút, postup nebudem zbytočne uvádzať, no jednoducho vzniklo z toho takéto niečo:
(je to skrátené, len na ukážku hodnôt, je to pole s číslami dní a ku každému dňu priradené všetky minúty, kedy sa pracuje)
Následne som si vytvoril funkciu, ktorá od aktuálneho času (času objednávky) mala za úlohu pripočítať 240 pracovných minút po jednej minúte, čiže sa prechádzala každá minúta, napr. teraz je 20:22, tak sa zistilo, či 20:23 je v poli s otváracími minútami u daného dňa (teda niečo ako in_array("20:06", $otvaracie_minuty), 7tka v zmysle nedeľa)). Ak bolo, tak sa počet minút, ktoré treba prirátať znížil (240-1) a takto to išlo minúta po minúte až kým sa počet minút, ktoré treba odrátať od 240, nedostal na nulu...
Toto riešenie viac menej fungovalo, až na to, že to trvalo niekoľko minút, kým sa to vypočítalo :) takže to nie je dobré riešenie, napadlo ma ho ešte vylepšiť tak že by sa v prípade minúty, ktorá sa nenachádza v otváracích (pracovných) minútach, prestalo ísť minúta po minúte (aby to neprechádzalo zbytočne všetky nočné minúty) ale skočilo by sa na najbližšiu pracovnú minútu, no ešte som neprišiel na to ako zistiť, ktorá to je...
Je toto moje riešenie príliš veľká blbosť alebo je to krok správnym smerom?
---------- Příspěvek doplněn 09.03.2014 v 20:29 ----------
Napsal iTerminator;1065706
Rychlovka
Tento kód ak som správne pochopil, priráta k aktuálnej hodiny 4 a zisťuje, či vypočítaná hodina je v niektorých z otváracích hodín. Ak je to tak, tak je to zaujímavý postup, no nie je to celkom ono, keďže napr. ak by to zisťovalo, či je v otváracích hodinách hodina "22" (napr. 22:30), tak tomu nebude vyhovovať žiadna z otváracích hodín a teda výsledok výpočtu bude nulový...
Ale aj tak vďaka za snahu.
---------- Příspěvek doplněn 09.03.2014 v 20:30 ----------
Napsal johanek;1065699
To, ze to nefunguje vzdy spravne je mozny, protoze jsem to nezkousel.
Tak je to udelany podle zadanych kriterii, nikde jsem se nedocetl, ze to ma byt menitelny, nicmene i podobnym zpusobem se to da udelat na jednodussi zmenu, ale to uz se mne vazne nechce predelavat.
OK, aj tak vďaka za snahu.
9. 3. 2014 20:25:30
https://webtrh.cz/diskuse/vypocet-datumu-a-casu-dodania#reply1003881
iTerminator
verified
rating uzivatele
(9 hodnocení)
9. 3. 2014 20:36:53
Ježiši kriste, šel jsem na to moc těžce.
Udělej si to pole, jako jsem udělal já, použij anglické názvy. Následně zjisti den v který byla žádost poslána, v poli vytáhni hodnoty toho dne a explodni je. Pokud bude aktuální čas + 4 hodiny větší nebo se bude rovnat času "od" a a menší nebo se bude rovnat času "do", tak "Přijdi v $dnes v $od", pokud se nebude shodovat, zjistíš následný den a vytáhneš hodnoty, explodneš a vypíšeš "Přijdi v $den v $od".
---------- Příspěvek doplněn 09.03.2014 v 20:40 ----------
A ten čas od do uváděj v sekundách a i ten aktuální čas převed na sekundy, pak to bude přesný. Jediná chybka by mohla nastat, pokud by to poslal třeba 23:59 a pracovalo by se od 3. hodiny, ale nejspíše to tak nebude.
9. 3. 2014 20:36:53
https://webtrh.cz/diskuse/vypocet-datumu-a-casu-dodania#reply1003880
crs
verified
rating uzivatele
(1 hodnocení)
9. 3. 2014 21:57:57
$cas=time(); //cas objednani
echo"Cas objednani: ".date('r',$cas)."n";
$PRACOVNI_HODINY=array( //pracovni hodiny, 1. cislo je den v tydnu (0=nedele..6=sobota)
1=>array(array(8,13),array(14,18)), //napr. 7:30 by bylo 7.5
2=>array(array(8,13),array(14,18)),
3=>array(array(8,13),array(14,18)),
4=>array(array(8,13),array(14,18)),
5=>array(array(8,13))
);
$do_vyzvednuti=4*60*60; //zpozdeni od objednavky k vyzvednuti (v ramci pracovnich hodin)
do{
if(empty($PRACOVNI_HODINY) or //neni pracovni den
strpos(' 1.1 6.1 1.5 8.5 5.7 29.8 1.9 15.9 1.11 17.11 24.12 25.12 26.12 ',date('d.m ')) or //je statni svatek
date('Y-m-d',easter_date(date('Y',$cas)))==date('Y-m-d',$cas)){ //jsou velikonoce
$cas+=86400-$cas%86400; //posuneme cas na zitrek v 00:00
continue;
}
$pracovni_den=&$PRACOVNI_HODINY;
for($i=0;$i
$pracovni_interval=&$pracovni_den;
if($cas%86400>=$pracovni_interval*3600) //po skonceni?
continue;
if($cas%86400<$pracovni_interval*3600) //jeste se nezacalo?
$cas=$cas-$cas%86400+$pracovni_interval*3600; //posuneme se na zacatek pracovniho intervalu
$do_konce=$pracovni_interval*3600-$cas%86400; //spocitame vteriny do konce intervalu
if($do_vyzvednuti>=$do_konce){ //nevystacime na vyrizeni objednavky
$do_vyzvednuti-=$do_konce;
$cas+=$do_konce;
}else{ //v tomto intervalu bude objednavka vyrizena
$cas+=$do_vyzvednuti;
$do_vyzvednuti=0;
break;
}
}
if($do_vyzvednuti) //pokud stale zbyva cas do vyzvednuti, presuneme se na dalsi den
$cas+=86400-$cas%86400;
else
break;
}while(TRUE);
echo"Cas vyzvednuti: ".date('r',$cas)."n";
9. 3. 2014 21:57:57
https://webtrh.cz/diskuse/vypocet-datumu-a-casu-dodania#reply1003879
Pro odpověď se přihlašte.
Přihlásit