ďťż

[php] data (np. minutę temu, 2h temu itd)

       

Podstrony


telcocafe

Czy mógłby ktoś podrzucić mi funkcję do której podaje się jakąś datę i czas a ona porównuje te argumenty z aktualną datą i czasem i wyświetla np. minuta temu, dwie minuty, 3h temu, dwa dni a jeśli większa rozpiętość czasowa to po prostu datę i czas z argumentu.



Gotowych skryptów nie dajemy. Odrobina matematyki i gotowe :-) Odejmujesz dziś od wtedy i sprawdzasz. Ot technika.

Też potrzebuję takiego rozwiązania. Nie wiem, jak się za to zabrać. Czy konwersja daty w formacie YYYY-MM-DD HH:MM:SS do znacznika czasu (timestamp) jest konieczna? Myślałem o czymś takim:
$czesciGodziny = array(12, 00, 05); $kombinacja = 20080623120005; //Chyba to już nie jest INT, prawda? $roznica = $dzisiejszaKombinacja - $kombinacja; //Ale w ten sposób efektu chyba nie uzyskam /* Metoda dobra jedynie do porównywania dat, ale operacja zbędna - stringi też da się porównać */
Niech na ten temat wypowiedzą się znawcy tematu. Pytania:
1. Czy konieczna jest zamiana daty na timestamp?
2. Jak przechowywać datę w bazie, aby osiągnąć najlepszą wydajność? Jako INT czy DATETIME? Martwić się o rok 2038?
3. Generować sformatowaną datę po stronie PHP czy bazy danych?

Efekty, które muszę uzyskać:
1. "5 minut temu"
2. Data we właściwej strefie czasowej (ustawionej przez użytkownika)
3. "23.05.2008, 12:23" (jeśli ustawiono taki format daty), opcjonalnie: "23 May 2008 o 12:23"
4. "Dzisiaj o 12:23"

Skrypt obsługuje bazy SQLite i MySQL. Aby formatować datę po stronie bazy, prawdopodobnie muszę tworzyć przy połączeniu (lub na żądanie) funkcję do tego celu - osobno dla każdego z tych silników.

Potrzebuję tylko wskazówek. W tym przypadku wydajność jest istotna. :) Szczególnie, gdy trzeba wygenerować N dat.
Użytkownik Ferrari edytował ten post 23 czerwiec 2008, 17:13
1) Tak
2) INT. A co myslisz ze twoja strona przezyje na tym samych skryptach 30 lat?
3) Php

A propo tematu to...
$roznica=time()-$data;
Gdzie $data to czas dla jakiego robimy porównanie. $roznica będzie przechowywała ilość sekund jaka minęła od czasu wywołania skryptu to $data.
A co zrobisz z ta rożnicą? Jezeli nie wiesz to kierunek podstawówka i nauka dzielenia.



@Ferrari: Po co kombinować z timestamp w bazie? Jest taka funkcja jak unix_timestamp. Później tylko dodajesz lub odejmujesz i generujesz co chcesz z date. W bazie timestamp jest potrzebne wtedy, gdy chcesz pobierać wpisy z konkretną datą, a jeśli to jest niepotrzebne, to po co używać? :-)

Poczekam jeszcze na wypowiedź innych użytkowników (pytania i potrzebne efekty w poprzednim poście). Wykonałem pomiar szybkości odczytu rekordów z datą zawierającą się w określonym przedziale czasu. http://www.unit1.pl/pb-817

Różnica jest prawie niezauważalna, jednak pola INT nieznacznie wygrywają. :)

Gdybyśmy jednak chcieli wyświetlić wszystkie rekordy dodane w roku 2008 lub w maju 2007 - z użyciem funkcji MONTH(), której brakuje w SQLite, pewnie wygrałby typ DATETIME. Można też wygenerować znaczniki czasu dla tych 2 punktów w PHP (godz. 0:00 GMT, 1 stycznia) - gmmktime() lub pochodna.

Niestety PHP opiera się głównie o znaczniki czasu, a nie YYYY-MM-DD. :( Funkcje typu strtotime() pełnią rolę pomocniczą.
Użytkownik Ferrari edytował ten post 23 czerwiec 2008, 23:15
W Django wszystko jest trzymane jako DATETIME (i przy okazji mapowane na pythonowy obiekt datetime). Testowanie "co szybsze" nie ma sensu - bo i ilość danych za mała i nie odzwierciedla prawdziwych zapytań w danej aplikacji (sprawdza się względem rzeczywiście używanych zapytań).

Problemów ciąg dalszy. Okazuje się, że w PHP brakuje funkcji gmtime(). Wprawdzie aktualny znacznik czasu dla GMT można uzyskać tak: time() - date('Z'), ale po co kombinować? Pomaga też date_default_timezone_set('GMT').

Czy jest w takim razie sens zapisywać wszystkie czasy do bazy danych w GMT? Czy lepiej w strefie lokalnej dla danego języka? Co o tym myślicie?

Funkcja formatująca datę - jeszcze niekompletna: http://rafb.net/p/yZsVSa57.html
Użytkownik Ferrari edytował ten post 25 czerwiec 2008, 15:41
Hmm... To zależy, czy strona będzie multijęzykowa, czy nie. Zresztą, jeśli tworzysz CMS-a, to zrób możliwość umieszczania w nim pluginów - jeśli ktoś zechce, to zrobi modyfikację na strefę czasową i po kłopocie.

CMS jest wielojęzyczny. Jądro musi oferować taki sam sposób zapisu i formatowania daty dla wszystkich modułów. Inaczej powstanie bałagan. Przymierzam się do takiego rozwiązania:setlocale('pl_PL', 'polish_Pol'); //W przypadku wyboru polskiego języka $userDate = $GMT_z_bazy + date('U');Gorzej ze zwróceniem znacznika czasu dla GMT - są 2 sposoby. Czy warto wywołać date_default_timezone_set('UTC')? Zaglądnąłem do źródła kilku skryptów - przechowują lokalny czas serwera, zaś w panelu admina można ustawić strefę czasową serwera. Jest 1 problem - po przenosinach na zagraniczny serwer mogą wystąpić problemy.

Wypełnijcie ankietę: Problem daty w PHP i systemach CMS

Oświadczam, że funkcja time() zwraca uniksowy znacznik czasu dla strefy GMT.
Użytkownik Ferrari edytował ten post 27 czerwiec 2008, 17:18
<?php function timeDiff($time, $opt = array()) { // The default values $defOptions = array( 'to' => 0, 'parts' => 1, 'precision' => 'second', 'distance' => TRUE, 'separator' => ', ' ); $opt = array_merge($defOptions, $opt); // Default to current time if no to point is given (!$opt['to']) && ($opt['to'] = time()); // Init an empty string $str = ''; // To or From computation $diff = ($opt['to'] > $time) ? $opt['to']-$time : $time-$opt['to']; // An array of label => periods of seconds; $periods = array( 'decade' => 315569260, 'year' => 31556926, 'month' => 2629744, 'week' => 604800, 'day' => 86400, 'hour' => 3600, 'minute' => 60, 'second' => 1 ); // Round to precision if ($opt['precision'] != 'second') $diff = round(($diff/$periods[$opt['precision']])) * $periods[$opt['precision']]; // Report the value is 'less than 1 ' precision period away (0 == $diff) && ($str = 'less than 1 '.$opt['precision']); // Loop over each period foreach ($periods as $label => $value) { // Stitch together the time difference string (($x=floor($diff/$value))&&$opt['parts']--) && $str.=($str?$opt['separator']:'').($x.' '.$label.($x>1?'s':'')); // Stop processing if no more parts are going to be reported. if ($opt['parts'] == 0 || $label == $opt['precision']) break; // Get ready for the next pass $diff -= $x*$value; } $opt['distance'] && $str.=($str&&$opt['to']>$time)?' ago':' away'; return $str; } ?>
kod z manuala, o to chyba chodzilo?!

edit: naskrobalem wlasny kod, jak komus sie przyda:
http://phpfi.com/328512

wejscie daty jest w $date forma int time();

wyjscie w $d forma (string)
Użytkownik bikstopa edytował ten post 01 lipiec 2008, 23:08
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.