Forum FAQForum FAQSearchSearch MemberlistMemberlist Forum ignore listForum ignore list RegisterRegister ProfileProfile Log in to check your private messagesLog in to check your private messages Log inLog in
Prikaz proteklog datuma

 
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    mi3dot.org Forum Index -> Server-side
View previous topic :: View next topic  
Author Message
Gale



Joined: 04 Apr 2005
Posts: 120

PostPosted: 26.10.2005 22:36    Post subject: Prikaz proteklog datuma Add user to your forum ignore list Reply with quote

Imam sljedecu skriptu:

Code:
<?php
function hr_oblik($n, $a='', $b='', $c=''){
   if(is_nan($n)) return false;

   if($n < 5 || $n > 20){
      $mod = $n%10;
      if($mod == 1) return $a;
      else if($mod < 5) return $b;
   }
   return $c;
}

function parseDate($date = null, $datestring = 'j.n.Y. \u H:i'){
   if(!$date || $date == '0000-00-00 00:00:00') return false;

   if(is_int($date)) $t = $date;
   else if(($t = strtotime($date)) === -1) return $date;
   $d = time() - $t;

   if($d < 60) return "prije $d sekund" . hr_oblik($d,'u','e','i');
   $d = floor($d / 60);
   if($d < 60) return "prije $d minut" . hr_oblik($d,'u','e','a');
   $d = floor($d / 60);
   if($d < 24) return "prije $d sat" . hr_oblik($d,'','a','i');
   $d = floor($d / 24);
   if($d < 7) return "prije $d dan" . hr_oblik($d,'','a','a');

   return date($datestring, $t);
}
?>


Skripta radi skroz zakon ali prikazuje mi npr:

"prije 1 dan i 3 sata" samo "prije 1 dan"
"prije 3 minute i 37 sekundi" samo "prije 3 minute"

Da li ima netko skriptu ili mi može pomoći modificirati ovu da radi gore navedenu radnju, pošto nisam baš na ti s manipulacijom s datumima!

Hvala
Back to top
View user's profile Send private message Visit poster's website
t3r0



Joined: 08 Jun 2004
Posts: 107

PostPosted: 26.10.2005 23:32    Post subject: Add user to your forum ignore list Reply with quote

Gubitke ti vjerojatno uzrokuju djeljenje + floor
A i mislim da si krenuo krivom logikom (obrnuto) što se tiče ovog djela ...:
Code:

if($d < 60) return "prije $d sekund" . hr_oblik($d,'u','e','i');
$d = floor($d / 60);
if($d < 60) return "prije $d minut" . hr_oblik($d,'u','e','a');
$d = floor($d / 60);
if($d < 24) return "prije $d sat" . hr_oblik($d,'','a','i');
$d = floor($d / 24);
if($d < 7) return "prije $d dan" . hr_oblik($d,'','a','a');


a to mi se cini zato jer sam ja pisao takvu funkciju ... (koja bas i nije optimizirana, ali radi)

btw
zasto ne pises preglednije Twisted Evil Rolling Eyes Laughing
Code:
 if (uvjet) {
       nesto
 }
Back to top
View user's profile Send private message
Gale



Joined: 04 Apr 2005
Posts: 120

PostPosted: 27.10.2005 19:22    Post subject: Add user to your forum ignore list Reply with quote

Hvala na skripti, lijepo radi samo je istina treba optimizirati.
Preradio sam ju da izbacuje samo dva zadnja polja umjesto cijelog arraya i sad ispisuje imena minute, sate ... na Hrvatskom.

Pa evo ako nekom treba:

Code:
<?php

   function timeSince($dt) {

       $d = time() - strtotime($dt);

       $v[6] = intval($d / (60*60*24*365));
       $d = $d - ($v[6] * (60*60*24*365));
       $v[5] = intval($d / (60*60*24*30));
       $d = $d - ($v[5] * (60*60*24*30));
       $v[4] = intval($d / (60*60*24*7));
       $d = $d - ($v[4] * (60*60*24*7));
       $v[3] = intval($d / (60*60*24));
       $d = $d - ($v[3] * (60*60*24));
       $v[2] = intval($d / (60*60));
       $d = $d - ($v[2] * (60*60));
       $v[1] = intval($d / (60));
       $v[0] = $d - ($v[1] * 60);

        $s = array('sekund', 'minut', 'sat', 'dan', 'tjed', 'mjesec', 'godin');

        for($i = 6; $i >= 0; $i--){
         $t = $v[$i];
            if($t != 0){
            $vrijeme = 'prije ' . $t . ' ' . $s[$i] . hr_oblik($t, $i);
                if($i != 0 && $v[$i - 1] != 0){
               $vrijeme .= ' i ' . $v[$i - 1] . ' ' . $s[$i - 1] . hr_oblik($v[$i - 1], $i-1);
            }
             return $vrijeme;
         }
        }
   }

   function hr_oblik($d, $i){

       switch($i){
         case 0: $a='u'; $b='e'; $c='i'; break;
         case 1: $a='u'; $b='e'; $c='a'; break;
         case 2: $a='';  $b='a'; $c='i'; break;
            case 3: $a='';  $b='a'; $c='a'; break;
            case 4: $a='an';  $b='na'; $c='';  break;
            case 5: $a='';  $b='a'; $c='i'; break;
            case 6: $a='a'; $b='e'; $c='a'; break;
        }

       if($d < 5 || $d > 20){
         $mod = $d%10;
         if($mod == 1) return $a;
         else if($mod < 5) return $b;
       }
       return $c;
   }

?>


Last edited by Gale on 27.10.2005 23:47; edited 1 time in total
Back to top
View user's profile Send private message Visit poster's website
Sulien



Joined: 04 Jan 2004
Posts: 2905
Location: Zagreb

PostPosted: 27.10.2005 20:54    Post subject: Add user to your forum ignore list Reply with quote

Code:
$now = date("Y-m-d H:i:s");
$yhr_now = strval(substr($now,0,4));
$mth_now = strval(substr($now,5,2));
$day_now = strval(substr($now,8,2));
$hr_now  = strval(substr($now,11,2));
$min_now = strval(substr($now,14,2));
$sec_now = strval(substr($now,17,2));
$now_time = mktime($hr_now, $min_now, $sec_now, $mth_now, $day_now, $yhr_now);

vidio sam bisera u PHP-u ali ovo je rekorder Laughing

...a ovo je samo za dobit trenutni Unix timestamp! kako onda rješavaš teže probleme bojim se i pomisliti Confused
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Gale



Joined: 04 Apr 2005
Posts: 120

PostPosted: 27.10.2005 22:49    Post subject: Add user to your forum ignore list Reply with quote

Dobro kako to onda bolje riješiti?
Ako si vidio gornje postove skripta nije moja, a nemam prevelikog iskustva u radu s datumima!
Back to top
View user's profile Send private message Visit poster's website
Gale



Joined: 04 Apr 2005
Posts: 120

PostPosted: 27.10.2005 23:32    Post subject: Add user to your forum ignore list Reply with quote

Da. Embarassed

Skriptu sam isprobao, radila je, pa sam ju samo modificirao za moje potrebe, a nisam ni kužio što toćno radi taj dio koda.

$now_time = time();

Istina jednostavnije je! Very Happy
Prepravio sam skriptu gore!
Back to top
View user's profile Send private message Visit poster's website
Sulien



Joined: 04 Jan 2004
Posts: 2905
Location: Zagreb

PostPosted: 28.10.2005 00:46    Post subject: Add user to your forum ignore list Reply with quote

hvala bogu da to nisi ti pisao, žalim onoga koji na taj način vadi timestamp

evo turbo funkcije:
Code:
function hr_time($date1, $date2 = null, $precision = 2){
   if(!$date1 || $date1 == '0000-00-00 00:00:00') return false;
   if(!$date2) $date2 = time();
   
   $d = (is_string($date2) ? strtotime($date2) : $date2)
      - (is_string($date1) ? strtotime($date1) : $date1);
   if(!$d) return 'nula sekundi'; // OMG!!!
   
   $divs = array(
      array('sekund', 60, 'u', 'e', 'i'), array('minut', 60, 'u', 'e', 'a'),
      array('sat', 24, '', 'a', 'i'), array('dan', 30, '', 'a', 'a'),
      array('mjesec', 12, '', 'a', 'i'), array('godin', 666, 'u', 'e', 'a')
      );
   
   foreach($divs as $div){
      if(!$n = $d%$div[1]) $stack[] = null;
      else {
         $str = $n.' '.$div[0];
         
         if($n < 5 || $n > 20){
            $mod = $n%10;
            if($mod == 1) $str .= $div[2];
            else if($mod && $mod < 5) $str .= $div[3];
            else $str .= $div[4];
         }
         else $str .= $div[4];
         
         $stack[] = $str;
      }
      
      if($d < $div[1]){
         if($precision > 1) break;
         else return array_pop($stack);
      }
      $d = floor($d / $div[1]);
   }
   
   $stack = array_reverse(array_diff(array_slice($stack, -$precision), array(null)));
   $sup = array_pop($stack);
   if(count($stack)) return implode(', ', $stack) . ' i ' . $sup;
   else return $sup;
}

Ako netko zna što se unutra dešava svaka mu čast Cool

Funkcija je napravljena tako da za dva parametara uzima početni i krajnji datum, a za treći preciznost (integer). Samo prvi parametar je potreban, krajnji datum je logično po defaultu trenutni timestamp a preciznost je 2. Datumi se mogu dati kao timestamp ili kao string u nekom prepoznatljivom formatu (vidi funkciju strtotime).

Što mislim pod preciznost? Funkcija razbija vremenski period do zadnje sekunde. E sad, godina dana manje jedna sekunda bi kao string bilo:
Code:
11 mjeseci, 29 dana, 23 sata, 59 minuta i 59 sekundi

Sad, to je malo bez veze jer nitko takvo nešto ne želi vidjeti na sajtu. Ako funkciji damo preciznost 2 (default), dobit ćemo
Code:
11 mjeseci i 29 dana

Preciznost 3 je
Code:
11 mjeseci, 29 dana i 23 sata

...i tako dalje.

Kvaka: funkcija ne barata sa tjednima. Još. I ograničena je na vremenske razmake od 666 godina Twisted Evil
Back to top
View user's profile Send private message Send e-mail Visit poster's website
t3r0



Joined: 08 Jun 2004
Posts: 107

PostPosted: 28.10.2005 01:17    Post subject: Add user to your forum ignore list Reply with quote

Sulien wrote:
Code:
$now = date("Y-m-d H:i:s");
$yhr_now = strval(substr($now,0,4));
$mth_now = strval(substr($now,5,2));
$day_now = strval(substr($now,8,2));
$hr_now  = strval(substr($now,11,2));
$min_now = strval(substr($now,14,2));
$sec_now = strval(substr($now,17,2));
$now_time = mktime($hr_now, $min_now, $sec_now, $mth_now, $day_now, $yhr_now);

vidio sam bisera u PHP-u ali ovo je rekorder Laughing


funkcija je prvotno bila namjenjena da racuna koliko je proslo vremena izmedju 2 zadana datuma iz baze, pa sam ostavio taj dio koda da se moze jednostavno preoblikovati u prvotni oblik.

Code:
...a ovo je samo za dobit trenutni Unix timestamp! kako onda rješavaš teže probleme bojim se i pomisliti


onda bolje i nemoj ...

Last edited by t3r0 on 28.10.2005 22:45; edited 1 time in total
Back to top
View user's profile Send private message
Gale



Joined: 04 Apr 2005
Posts: 120

PostPosted: 28.10.2005 13:55    Post subject: Add user to your forum ignore list Reply with quote

Sulien wrote:

evo turbo funkcije:


Hvala na postu, ali ostajem pri prošloj funkciji jer već sam si ju sredio tako da mi odgovara za ono šta meni treba.
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    mi3dot.org Forum Index -> Server-side All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group