Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Skrypt daty
khalka
post 15.05.2018, 19:07:43
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 15.05.2018

Ostrzeżenie: (0%)
-----


Witam,

Przyszła ostateczność więc piszę w sprawie pomocy.

Co chce zrobić:

Potrzebuje napisać skrypt, który do daty dzisiejszej doda x dni i ją wyświetli, lecz jeśli w daną datę wypada weekend, lub święta ma pokazać datę przypadającą na kolejny dzień roboczy.

Ogólnie kod poniżej "prawie" działa, z tym, że w tablicy $busy teraz już konkretnie mi się coś pomieszało i błędnie wskazuje weekendy i święta.

Mogę prosić o poprawienie kodu, aby w końcu zaczął działać? Przyznam się że już parę dni go męczę. Ogólnie daty sprowadziłem do liczby dni roku, ale jeśli ktoś ma lepszy pomysł czekam na sugestię.

Z góry dziękuje!


  1. $currentYear = date('Y');
  2. $swieta = array(
  3. date('d.m',mktime(0,0,0,1,1,$currentYear)),
  4. date('d.m',mktime(0,0,0,1,6,$currentYear)),
  5. date('d.m',mktime(0,0,0,3,21+easter_days($currentYear),$currentYear)),
  6. date('d.m',mktime(0,0,0,3,21+easter_days($currentYear)+1,$currentYear)),
  7. date('d.m',mktime(0,0,0,5,1,$currentYear)),
  8. date('d.m',mktime(0,0,0,5,3,$currentYear)),
  9. date('d.m',mktime(0,0,0,3,21+easter_days($currentYear)+49,$currentYear)),
  10. date('d.m',mktime(0,0,0,3,21+easter_days($currentYear)+60,$currentYear)),
  11. date('d.m',mktime(0,0,0,8,15,$currentYear)),
  12. date('d.m',mktime(0,0,0,11,1,$currentYear)),
  13. date('d.m',mktime(0,0,0,11,11,$currentYear)),
  14. date('d.m',mktime(0,0,0,12,25,$currentYear)),
  15. date('d.m',mktime(0,0,0,12,26,$currentYear))
  16. );
  17.  
  18.  
  19.  
  20. $days_in_year = date("z", mktime(0, 0, 0, 12, 31, $currentYear)) + 1;
  21. $busy = array();
  22. for($day = 1; $day <= $days_in_year; $day++) {
  23. $busy[$day] = false;
  24. }
  25.  
  26. $end = new DateTime(strval($currentYear) . "-12-31");
  27. $endTimestamp = $end->getTimestamp();
  28.  
  29. $now = new DateTime(strval($currentYear) . "-01-01");
  30. $now->setTime(0,0);
  31. $d = $now;
  32.  
  33. $oneday = new DateInterval("P1D");
  34. $sixdays = new DateInterval("P6D");
  35. #$res = array();
  36. while ($d->getTimestamp() <= $endTimestamp) {
  37.  
  38. $currentDay = date('z', strtotime($d->format("Y-m-d")))-1;
  39. if($currentDay > 0)
  40. $busy[$currentDay] = true;
  41.  
  42. $d = $d->add($oneday);
  43. if ($d->getTimestamp() <= $endTimestamp) {
  44. $currentDay = date('z', strtotime($d->format("Y-m-d")))-1;
  45. if($currentDay > 0)
  46. $busy[$currentDay] = true;
  47. }
  48. $d = $d->add($sixdays);
  49. }
  50.  
  51. if(!empty($swieta)) {
  52. foreach($swieta AS $data) {
  53. $currentDay = date('z', strtotime($data . '.' . strval($currentYear)))+1;
  54. if($currentDay > 0)
  55. $busy[$currentDay] = true;
  56. }
  57. }
  58.  
  59. $czasdostawy = 4;
  60. $dzis = date('d.m.Y');
  61. echo 'Dzis: '.$dzis;
  62. $typowana_data = date('d.m.Y',strtotime($dzis.' + '.$czasdostawy.' day'));
  63. echo '<br>Typowna data: '.$typowana_data.'<br>';
  64.  
  65. $selected_day = date('z', strtotime($typowana_data));
  66. echo 'Przed: ' . $selected_day.'<br>';
  67.  
  68. while($busy[$selected_day] == true) {
  69. $selected_day++;
  70. }
  71.  
  72. echo 'Po: ' . $selected_day.'<br>';
  73.  
  74. $pokazdate = DateTime::createFromFormat('Y z', strval($currentYear) . ' ' . strval($selected_day));
  75. echo 'dobra data: '.$pokazdate->format('y-m-d').'<br>';
  76.  
  77. echo '<pre>';
  78. print_R($busy);
  79. echo '</pre>';
Go to the top of the page
+Quote Post
viking
post 15.05.2018, 19:38:22
Post #2





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


  1. $date = new DateTime();
  2. $date->modify('+3 weekday');
  3. echo $date->format('Y-m-d');


--------------------
Go to the top of the page
+Quote Post
khalka
post 15.05.2018, 19:44:14
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 15.05.2018

Ostrzeżenie: (0%)
-----


@viking

No rozgromiłeś mnie tą kompresją kodu. Ale fakt - działa, dziękuje za tą część wink.gif Tylko kwestia jak dopiąć do tego nasze święta i dni ustawowo wolne? smile.gif
Go to the top of the page
+Quote Post
viking
post 15.05.2018, 20:24:03
Post #4





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Ja bym użył coś gotowego np. http://florianv.github.io/business/


--------------------
Go to the top of the page
+Quote Post
khalka
post 15.05.2018, 21:02:17
Post #5





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 15.05.2018

Ostrzeżenie: (0%)
-----


Bardziej myślałem o tablicy z dniami, (już ją sobie stworzę) i puszczenie to przez pętle while i jeśli jest taka data w tablicy to dodajemy +1 dzień i od nowa sprawdzamy smile.gif


EDIT:

Chyba się udało smile.gif Może ktoś zerknąć czy to ma sens?

  1. $currentYear = date('Y');
  2. $swieta = array(
  3. date('d-m-Y',mktime(0,0,0,1,1,$currentYear)),
  4. date('d-m-Y',mktime(0,0,0,1,6,$currentYear)),
  5. date('d-m-Y',mktime(0,0,0,3,21+easter_days($currentYear),$currentYear)),
  6. date('d-m-Y',mktime(0,0,0,3,21+easter_days($currentYear)+1,$currentYear)),
  7. date('d-m-Y',mktime(0,0,0,5,1,$currentYear)),
  8. date('d-m-Y',mktime(0,0,0,5,3,$currentYear)),
  9. date('d-m-Y',mktime(0,0,0,3,21+easter_days($currentYear)+49,$currentYear)),
  10. date('d-m-Y',mktime(0,0,0,3,21+easter_days($currentYear)+60,$currentYear)),
  11. date('d-m-Y',mktime(0,0,0,8,15,$currentYear)),
  12. date('d-m-Y',mktime(0,0,0,11,1,$currentYear)),
  13. date('d-m-Y',mktime(0,0,0,11,11,$currentYear)),
  14. date('d-m-Y',mktime(0,0,0,12,25,$currentYear)),
  15. date('d-m-Y',mktime(0,0,0,12,26,$currentYear))
  16. );
  17.  
  18. $czasdostawy = 6;
  19. $date = new DateTime();
  20. $date->modify('+'.$czasdostawy.' weekday');
  21. $aaa = $date;
  22.  
  23. while (in_array($aaa->format('d-m-Y'), $swieta)) {
  24. $aaa->modify('+1 weekday');
  25. }
  26.  
  27. echo $aaa->format('d-m-Y');


Ten post edytował khalka 15.05.2018, 21:14:59
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 06:32