Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dodawanie dni do daty
anty
post
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 5.10.2007

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


Witam.

Mam kłopot z obliczeniami na dacie. Otóż mam w bazie zapisaną datę początkową oraz częstotliwość akcji wyrażoną w dniach. Skrypt musi zwracać termin kolejnej akcji w odniesieniu do aktualnej daty. Dzięki wykorzystaniu PHP 5.3 posiadam taki oto kod:

  1. //$devices[$i]['date_on'] - data początkowoa
  2. //$devices[$i]['freq'] - częstotliwość powtórzeń
  3. $dateOn = new DateTime($devices[$i]['date_on']);
  4. $frequency = new DateInterval('P' . $devices[$i]['freq'] . 'D');
  5. $dateOn->add($frequency);
  6. $e = $dateOn->format('Y-m-d');


Niestety zwraca on tylko datę pierwszej akcji, a nie tą najbliższą. Kompletnie nie znam się na klasach, a jak próbowałem rozwiązać problem za pomocą zamiany daty na czas UNIXa, odejmowaniu, dzieleniu i mnożeniu reszty przez bóg-wie-co to pojawiały się błędy w obliczeniach... Serdecznie proszę o pomoc w temacie.

Ten post edytował anty 10.03.2013, 23:53:03
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Pokaż lepiej co przekazujesz do konstruktorów smile.gif


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
anty
post
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 5.10.2007

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


  1. //Wartości:
  2. $devices[$i]['date_on'] - 2013-03-07
  3. $devices[$i]['freq'] - 3 (dni oczywiście)


Chodzi o to, żeby skrypt zwaracał datę następnej iteracji, czyli w tym przypadku powinno być 2013-03-13 (bo dzisiaj mamy 2013-03-11).

Ten post edytował anty 11.03.2013, 09:43:59
Go to the top of the page
+Quote Post
hind
post
Post #4





Grupa: Zarejestrowani
Postów: 142
Pomógł: 24
Dołączył: 30.03.2009
Skąd: Rokitno Szlacheckie

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


coś mi się wydaje że powinieneś podawać datę w formacie $devices[$i]['date_on'].' 00:00:00'
Go to the top of the page
+Quote Post
szok
post
Post #5





Grupa: Zarejestrowani
Postów: 165
Pomógł: 20
Dołączył: 2.03.2006

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


http://php.net/manual/pl/datetime.modify.php


--------------------
Go to the top of the page
+Quote Post
anty
post
Post #6





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 5.10.2007

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


Czyli i tak muszę odjąć od obecnej daty datę uruchomienia, a następnie obliczyć w którym dniu cyklu się znajduję...
Go to the top of the page
+Quote Post
hind
post
Post #7





Grupa: Zarejestrowani
Postów: 142
Pomógł: 24
Dołączył: 30.03.2009
Skąd: Rokitno Szlacheckie

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


zawsze możesz pobawić się mktime i dodać 3600*24*ilość_dni
Go to the top of the page
+Quote Post
anty
post
Post #8





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 5.10.2007

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


Probowałem ogarnąć to prymitywnym sposobem, ale pojawiały się błędy w wyliczaniu kolejnej daty - czasami działało, a czasami nie. Nie wiem, być może problemem była reszta z dzielenia która nie zawsze wychodziła na tyle ładna by po przemnożeniu na koniec uzyskać "ładny" wynik?

  1. $unix_on=strtotime($devices[$i]['date_on']);
  2. $unix_today=strtotime(date('Y-m-d'));
  3. $actions=($unix_today-$unix_on)/(86400*$devices[$i]['freq']); // wyliczam ile akcji nastąpiło do tej pory
  4. $b=explode(".", $actions);
  5. $a='0'.'.'.$b['1'];
  6. $f=$a*$devices[$i]['freq'];
  7. $d=$unix_today+($f*86400); // reszta z dzielenia przemnożona przez częstotliwość powinna zwrócić ilość dni za ile wypadnie kolejna wizyta
  8. $e=date("Y-m-d",$d);


Pomysł na powyższy algorytm pewnie jest niedoskonały, ale próbuję...

Ten post edytował anty 11.03.2013, 12:53:59
Go to the top of the page
+Quote Post
destroyerr
post
Post #9





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Coś takiego powinno zadziałać:
  1. $diff = $dateOn->diff(new DateTime())->format('%d');
  2. $diff = floor($diff / $devices[$i]['freq']) * $devices[$i]['freq'];
  3. $diff = new DateInterval('P'.$diff.'D');
  4.  
  5. $dateOn->add($diff)->add($frequency);
  6.  
  7. $e = $dateOn->format('Y-m-d');
Go to the top of the page
+Quote Post
Fifi209
post
Post #10





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Masz tutaj kawałek kodu:

  1. <?php
  2.  
  3. $obj = new DatePeriod(new DateTime('2013-03-07'), new DateInterval('P3D'), 4);
  4.  
  5. foreach ($obj as $date) {
  6. echo $date->format('Y-m-d').'<br/>';
  7. }
  8.  
  9. ?>


Baw się smile.gif Wymyśl jeszcze jak wybrać odpowiednią datę.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
anty
post
Post #11





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 5.10.2007

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


Dziękuję za powyższe odpowiedzi. Niestety miałem pewne problemy z przedstawionymi fragmentami kodu, ale jakoś udało mi się rozgryźć to inaczej:

  1. //dd - dzisiejsza data
  2. //instal_date_marker - data instalacji w znaczniku czasu
  3. //freq_marker - częstotliwość odwiedzin w znaczniku czasu
  4. while ($instal_date_marker+$freq_marker*$n<$dd)
  5. {
  6. $new_date=date("Y-m-d", $instal_date_marker+$freq_marker*$n);
  7. $n++;
  8. }
  9. $new_date=date("Y-m-d", $instal_date_marker+$freq_marker*$n);


Może komuś się przyda smile.gif
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 Aktualny czas: 20.08.2025 - 05:18