Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z funkcją 'strtotime'
Forum PHP.pl > Forum > PHP
spit
Cześć
Chcę u siebie na stronie wyświetlić datę z formacie DD.MM.RRRR. W bazie, w polu 'wydanie' (typ: date), jest w formacie RRRR-MM-DD. Gdy chce go sformatowac zwykłą fukncją date, czyli tak:
  1. <?php
  2. date("d.m.Y"$rekord["wydanie"])
  3. ?>
pojawia się data 01.01.1970. Znalazłem funkcję strtotime, i tak jej użyłem:
  1. <?php
  2. date("d.m.Y", strtotime($rekord["wydanie"]))
  3. ?>
. I niby wszystko OK, ale gdy zedytuje wpis, w którym jest data, wszystko wariuje. Z roku 2006 robi się 2022, a daty 1984-00-00 31-11-1983. Co robić?
nospor
a $rekord["wydanie"] w jakim jest formacie?

nie wiem czy to literowka, ale:date("d.m.Y"$rekord["wydanie"])
powinno byc (mam na mysli skladnie): date("d.m.Y",$rekord["wydanie"])

edit: wycofuje pierwsze pytanie smile.gif

edit2: co rozumiesz przez "zedytuje"? gdzie to edytujesz?
Adiasz
W bazie trzymasz w postaci Y-m-d a na sajcie wyswietlasz w d-m-Y zeby poprawnie zapisac zmodyfikowana date musisz ja znowu odwrocic
spit
zedytuje, np. w phpmyadmine smile.gif
z ta literowka to faktycznie, dalem przecinka, ale to dlatego, ze szybko pisalem.

@Adiasz:
jak odwrocic? zapisane w bazie? no tego wole nie robic, na wpisie w takim wlasnie formacie opieram sortowanie.
Adiasz
Chodzilo mi o to ze jezeli w bazie masz format daty Y-m-d to nie mozesz go prubowac zpisywac w formacie d-m-Y bo mozesz dostac dziwne rezultaty jak powyzej i przed zapisem do bazy trzeba Y z d zamienic. Twoje bledy moga wynikac z tego blednego formatu.
spit
Ale to format pola 'date', nie moge go zmieniac jak chce.
thornag
Cytat(spit @ 17.07.2006, 11:34 ) *
Znalazłem funkcję strtotime, i tak jej użyłem:
  1. <?php
  2. date("d.m.Y", strtotime($rekord["wydanie"]))
  3. ?>
.


To dziwne rzeczywiscie

@Adiasz -> popatrz na to z innej strony w $rekord['wydanie'] przechowywana jest data 2006 7 16 pozniej skrypt zamienia ja na timestamp " strtotime($rekord["wydanie"]) ", na koncu zas zamienia timestamp na 16 7 2006, wiec teoretycznie wszystko powinno byc w porzadku.

Nie wiem dlaczego to nie chce dzialac smile.gif Moze sprobuj poprostu pole z data ustawic na int13 i zapisywac timestamp zamiast stringowej daty. smile.gif

Mimo wszystko jak dla mnie wszystko wskazuje na jakis blad przy edycji smile.gif Albo strtotime zle zamienia na timestamp. Sprawdz czy skrypt dobrze zamienia timestamp smile.gif

Pobierz z bazy zamien na timestamp pozniej zamien timestamp spowrotem na format z bazy i zobacz czy jest taka sama data. Pozniej edytuj pole i zrob to samo. Wyciagnij wnioski itp itp smile.gif
spit
Dla mnie to ewidentna wina edycji, tyle że co, phpmyadmin robi błędy? Nie sądze. Dlaczego tak mówie? Gdy normalnie dodaje rekord, wpisuje date (2005-10-12), jest wyświetlana dobrze (12.10.2005), a gdy ten rekord zedytuje (powiedzmy zmienie zawartość pola 'utwory') data zmienia się na jakąś kosmiczną np. z rokiem 2021. Spróbuje się jeszcze pobawić timestampem.
thornag
Po edycji przez phpMyAdmin, probowales sprawdzic czy rekord ma prawidlowa date ?

Zedytuj rekord i w phpmyadmin sprawdz czy data jest nadal dobra, jesli nie to znaczy ze to definitywnie wina edycji smile.gif

Off.. Coz za szerlokowa konkluzja biggrin.gif
spit
Data oczywiście jest poprawna po edycji. Tylko wyświetlana jest źle.
thornag
Tak jak mowilem, ja bym zapisywal w bazie danych timestampy, no ale nie o to chodzi...

Jeszcze jedno pytanie mam. Czy po pobraniu rekordu (edytowanego) jak wyswietlasz date bez zadnych zmian jak strtotime date to jest ona poprawa?

Jak wyszlo testowanie z timestampami, takie same ?
spit
A więc doszedłem do tego, iż błędna data wyświetla się tylko wtedy, gdy w dniu lub miesiącu są dwa zera, np. 1994-00-00. Podaje tak wtedy, gdy nie znam dokładnej daty. Nie mogę wstawić XX-XX, a błędnej daty podawać nie chce. Co radzicie?
thornag
No raczej zadna funkcja nie jest przygotowana na zerowy dzien i miesiac smile.gif Chyba musisz zrezygnowac z takiego zapisu daty. W ogole dziwie sie ze sie MySQL nie pluje o taki typ zapisanej daty.
spit
Więc jeżeli nie date, to co? Zależy mi właśnie na tym, by data była w formacie YYYY-MM-DD, i dała się przerabiać, gdyż używam jej w dwóch przypadkach (sortowanie i wyświetlanie informacji).
thornag
DLatego najlepszy moim zdaniem jest time stamp. Ustaw pole jako int 13 i zapisuj timestamp do bazy. Szybsze sortowanie a i zrobic z nim mozesz co dusza zapragnie za pomoca funkcji date();
dzobert
Ja u siebie zamiasta pola date zrobiłem pole int i wstawiam tam datę, w takim formacie jak chce
spit
Cytat(thornag @ 20.07.2006, 18:31 ) *
DLatego najlepszy moim zdaniem jest time stamp. Ustaw pole jako int 13 i zapisuj timestamp do bazy. Szybsze sortowanie a i zrobic z nim mozesz co dusza zapragnie za pomoca funkcji date();

Tak, tylko jak przekonwertować pole Date na Int? Prz konwersji wszystkie wartości w tym polu się zerują (0000-00-00). Szukanie grubo ponad 300 dat mi się nie usmiecha winksmiley.jpg
thornag
Utworz tymczasowa tabele z indeksem i czasem z tabeli pierwszej. Potem SELECT przekonwertuj wszio, wrzuc do tymczasowej. Pozneij zmien typ i powrzucaj ponownie.
spit
No ok, ale gdybym chciał dać zamiast dnia czy miesiąca wartość XX, to funkcja 'date' się odzywa, że nie da rady. Da rade to obejść?
thornag
Mozesz wstawiac tam zero np, a pozniej jak zamieniasz to funkcja date() wyrzuci Ci defaultowa date unixowa. MOzesz wtedy to sprawdzic strcompare albo czyms i jesli jest defaultowa to olac jesli inna to wyswietlac. Wszystko zalezy od tego do czego Ci potrzebna ta data w formacie XX
spit
Chcę wyświetlać datę wydania, w formacie 00.00.0000. Ale często nie można znaleść dokladnej daty, tylko sam rok, badz rok i miesiąc. Wtedy chce wyswietlac XX.XX.0000 czyt XX.00.0000. O to mi chodzi.
cicik
Cytat(spit @ 17.07.2006, 16:10 ) *
Ale to format pola 'date', nie moge go zmieniac jak chce.


polecam zainteresowac sie funkcja date_format w mysqlu
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.