Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Operacje na datach (PHP5)
Forum PHP.pl > Forum > PHP
seba22
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
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 smile.gif

pozdr.
pyro
  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. ?>
zimi
@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. ?>
pyro
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
seba22
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
pyro
seba22, a spróbuj tego co ja ci podałem.
zimi
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...
nospor
nie: $datakoniec=strtotime (("+1 month"), "$obecna_data");
a: $datakoniec=strtotime ("+1 month", strtotime($obecna_data));
Kocurro
Kod
UPDATE "uzytkownicy" SET "czassubskrypcji" = FROM_UNIXTIME( UNIX_TIMESTAMP() + 30 * 24 * 60 * 60 ) WHERE ...


Na przykład tak winksmiley.jpg

pozdr.
Łukasz
seba22
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 ?
pyro
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.
seba22
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 ?
pyro
ale możesz operować na timestampach, wtedy można normalnie odejmowac
Kocurro
Kurcze chyba jakaś blokada jest na moim koncie, że nie widać co piszę ... chyba wspominałem o timestampach smile.gif

pozdr.
Łukasz
Kicok
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
Babcia@Stefa
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.