Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Operacje na datach (PHP5)
seba22
post
Post #1





Grupa: Zarejestrowani
Postów: 293
Pomógł: 4
Dołączył: 28.01.2005

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


Witam Państwa,

Mam uprzejme zapytanie czy ktoś był by mi w stanie pomóc.
Pracuję nad prostym skryptem i potrzebuję dowiedzieć się w jaki sposób mogę działać na datach w PHP.

Tak więc pobieram sobie z PHP aktualną datę.


$obecna_data = date("Y-m-d H:i");


w związku z czym dostaję coś mniej więcej takiego:

$data = "2008-07-25 09:15";



Teraz, chciał bym wykonać zapytanie do serwera MYSQL, i powiedzieć mu że użytkownik zarejestrował subskrypcję poprawnie, a czas jej trwania będzie wynosić przyszłe 30 dni !

W związku z czym utworzyłem na serwerze MYSQL 2 pola, dataaktywacji datadeaktywacji.

W dataaktywacji wprowadzam aktualną datę -> $obecna_data = date("Y-m-d H:i");

i w tym momencie wykonania skryptu, chciał bym aby do serwera SQL poszło również zapytanie dodające datę wyłączenia będącą aktualną datą + 30 dni !


Dzięki temu, w późniejszej części programu mógł bym spokojnie odliczać czas w stylu pozostało, tyle i tyle dni do wygaśnięcia subskrypcji.



Tak więc Panie i Panowie czy jest możliwość aby do takiej danej: $obecna_data = date("Y-m-d H:i"); wyprzedzić czas i dodać te 30 dni ?




Będę bardzo wdzięczny za wszelką pomoc.
pozdrawiam


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 17)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




http://pl2.php.net/manual/pl/function.strtotime.php


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kocurro
post
Post #3





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

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


Hmm - jeśli korzystasz z mysql to lepiej używaj pól integer przechowujących unix_timestamp - wtedy o wiele łatwiej operować na datach jest smile.gif

pozdr.
Go to the top of the page
+Quote Post
pyro
post
Post #4





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


  1. <?php
  2. $data_plus_30_timestamp = mktime(date('H'), date('i'), 0, date('m'), date('d') + 30, date('Y'));
  3. $data_plus_30 = date("Y-m-d H:i", $data_plus_30_timestamp);
  4. ?>


Ten post edytował pyro 25.07.2008, 08:57:31


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
zimi
post
Post #5





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


@pyro:
  1. <?php
  2. mktime(date('H'), date('i'), 0, date('m'), date('d') + 30, date('Y'));
  3. ?>

WTF?
  1. <?php
  2. strtotime('+ 30 days');
  3. ?>


Ten post edytował zimi 25.07.2008, 09:02:51
Go to the top of the page
+Quote Post
pyro
post
Post #6





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat(zimi @ 25.07.2008, 10:02:35 ) *
@pyro:
  1. <?php
  2. mktime(date('H'), date('i'), 0, date('m'), date('d') + 30, date('Y'));
  3. ?>

WTF?
  1. <?php
  2. strtotime('+ 30 days');
  3. ?>


moj sposob bardziej jako alias haha.gif, ale działa wyśmienicie


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
seba22
post
Post #7





Grupa: Zarejestrowani
Postów: 293
Pomógł: 4
Dołączył: 28.01.2005

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


Witam,

Dziękuję za odpowiedzi.
Spróbowałem z opcją strtotime ale niestety nie jest to pożądane prze zemnie rozwiązanie :/


  1. <?php
  2. $obecna_data = date("Y-m-d H:i"); 
  3. $datakoniec=strtotime (("+1 month"), "$obecna_data");
  4. ?>




Na serwerze SQL wylądowały takie dane:

Id datazaplaty datawylaczenia
10 2008-07-25 10:03 2680408

Jak widać obydwa formaty się różnią zdecydowanie.
W jaki sposób więc miał bym je porównać, plus dodatkowo wykazać w zrozumiałym dla człowieka języku.


pozdrawiam


--------------------
Go to the top of the page
+Quote Post
pyro
post
Post #8





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


seba22, a spróbuj tego co ja ci podałem.


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
zimi
post
Post #9





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


hehe smile.gif podajesz bazie danych, date w formacie kilku cyferek która ona interpretuję na swój sposób... miałeś skorzystać z rozwiązania @pyro: ew. z podmienieniem fragmentu który wyszczególniłem...
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




nie: $datakoniec=strtotime (("+1 month"), "$obecna_data");
a: $datakoniec=strtotime ("+1 month", strtotime($obecna_data));


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kocurro
post
Post #11





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

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


Kod
UPDATE "uzytkownicy" SET "czassubskrypcji" = FROM_UNIXTIME( UNIX_TIMESTAMP() + 30 * 24 * 60 * 60 ) WHERE ...


Na przykład tak winksmiley.jpg

pozdr.
Łukasz
Go to the top of the page
+Quote Post
seba22
post
Post #12





Grupa: Zarejestrowani
Postów: 293
Pomógł: 4
Dołączył: 28.01.2005

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


Kurka wodna, muszę przyznać ze sposób użytkownika Pyro działa, i to całkiem sprawnie:

W bazie MySQL wylądowały następujące dane:


Id datazaplaty datawylaczenia
10 2008-07-25 10:13 2008-08-24 10:13


  1. <?php
  2. $obecna_data = date("Y-m-d H:i");
  3. $data_plus_30_timestamp = mktime(date('H'), date('i'), 0, date('m'), date('d') + 30, date('Y'));
  4. $data_plus_30 = date("Y-m-d H:i", $data_plus_30_timestamp);
  5. ?>



Czyli problem A został rozwiązany.


Pozostał jeszcze B polegający na odliczaniu czasu. od zmiennej $data_plus_30 -> Oficjalnie, będzie ona pobierana z serwera SQL, no ale możemy 100 % założyć ze jej odebrany format będzie identyczny jak tej zmiennej: $data_plus_30

Znalazłem w sieci na stronie http://webmade.org/porady/data-php.phpnastępujący kod:
  1. <?php
  2. $data = "2016-03-24";
  3. $obecna_data = date("Y-m-d"); // pobieranie aktualnej daty
  4. $pozostalo = (strtotime($data) - strtotime($obecna_data)) / (60*60*24);
  5. echo "Pozostało ".$pozostalo." dni do ".$data;
  6. ?>



Ale zwracane przez niego dane, są że tak powiem trudne w interpretacji.

Chciał bym napisać więc powiedzmy 3 proste IF-y.


jezeli data + 30 dni minus dzisiejsza data jest wieksza wieksza niz 5 dni - echo wszystko OK
jezeli data +30 dni minus dzisiejsza data jest mniejsza niż 5 dni - twoja subskrypcja wygasnie za mniej niz 5 dni, zapisz się ponownie.
jezeli data +30 dni minus dzisiejsza data jest mniejsza lub = 0 - twoja subskrypcja została wylaczona

i potrzebuję to w IF-ach, bo będę tam wstawiać zapytania do serwera SQL, które dezaktywują subskrypcje.


Czy jest jakiś sposób aby powalczyć tak z tymi datami ?


--------------------
Go to the top of the page
+Quote Post
pyro
post
Post #13





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat("seba22")
Kurka wodna, muszę przyznać ze sposób użytkownika Pyro działa, i to całkiem sprawnie:


No ba, chyba nikt nie miał wątpiwości tongue.gif, mógłbyś dać plusa za to.

A co do reszty twojego pytania, no to wystarczą najzwyklejsze w świecie if'y i prosta matematyka.


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
seba22
post
Post #14





Grupa: Zarejestrowani
Postów: 293
Pomógł: 4
Dołączył: 28.01.2005

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


Racja, Thank You kliknięte.

No ale jak twoim zdaniem porównać datę która ma : kropek w środku ?
Przecież dobrze wiemy, że to nie liczby standardowe, które możemy odejmować od siebie.
Np godziny mają 60 minut, a doba ma 24 godziny, więc nie możemy tego odejmować, zmienna1 0 zmienna2 ?


--------------------
Go to the top of the page
+Quote Post
pyro
post
Post #15





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


ale możesz operować na timestampach, wtedy można normalnie odejmowac


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
Kocurro
post
Post #16





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

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


Kurcze chyba jakaś blokada jest na moim koncie, że nie widać co piszę ... chyba wspominałem o timestampach smile.gif

pozdr.
Łukasz
Go to the top of the page
+Quote Post
Kicok
post
Post #17





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Cytat("Kocurro")
Hmm - jeśli korzystasz z mysql to lepiej używaj pól integer przechowujących unix_timestamp - wtedy o wiele łatwiej operować na datach jest

Ale dlaczego się tak upierasz przy tych timestampach? Że niby coś takiego:
Kod
FROM_UNIXTIME( UNIX_TIMESTAMP() + 30 * 24 * 60 * 60 )
jest czytelniejsze, albo wygodniejsze w napisaniu od:
Kod
ADDDATE( NOW(), 30 )

albo:
Kod
NOW() INTERVAL 30 DAY



O przechowywaniu daty w polach typu integer nie wspomnę. No chyba że tylko ja mam problemy z odczytywaniem 1234321234 jako 2008-09-23 13:57:04 gdy przeglądam tabelę w phpMyAdminie


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
Babcia@Stefa
post
Post #18





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

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


Ja w datach czasami się gubię, ale dużo miałem przypadków z operacjami na datach i każdy wyszedł poprawnie (wygasanie kont, aktualizacje statystyk itp.) smile.gif

Mi wystarczy tylko jedno pole w MySQL o typie INT.

Wrzucam tam mktime()+$IleSekundDoKonca i sprawdzam czy mktime() jest większe lub równe polu.

Dziękuję, Babcia@Stefa


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
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: 19.08.2025 - 16:09