: logica con differenze di date

Sto cercando una soluzione elegante per modificare il formato del tempo in base al periodo di tempo che intercorre tra ora e una data di formattazione ISO in un DB.

Mi piacerebbe che l'output assomigliasse a questo

//less than an hour 'X minutes have gone by' //less than 24 hours 'X hours have gone by' //greater than 24 hours ISO date 

Ecco cosa ho finora …

 $now = date("omd H:i:s") //now = something like '2009-12-28 16:39:00' $dateExample = '2009-12 16:37:00' $timeSpan = round(strtotime($now) - strtotime($dateExample)); if(($timeSpan/60)<=60) { echo $timeSpan." minutes"; } if(($timeSpan/(60*60))<=24) { echo ($timeSpan/(60*60))." Hours"; } else { echo $dateExample; } 

Le dichiarazioni sciatte se mi infastidiscono davvero e non riesco a capire un modo migliore per farlo ….

Un piccolo miglioramento:

 $dateExample = '2009-12 16:37:00' function timepass($dt){ $dt = (is_int($dt) ? $dt : strtotime($dt)); $timeSpan = round(time() - $dt); if(($timeSpan/60)<=60){ return $timeSpan." minutes"; }elseif(($timeSpan/(60*60))<=24){ return ($timeSpan/(60*60))." hours"; }else{ return date('omd H:i:s',$dt); } } echo timepass($dateExample); 

Non puoi davvero sbarazzarti delle affermazioni if, ma se il tuo punto è di condensare il codice, questo fa la stessa cosa:

 function timePassed($date) { $diff = time() - strtotime($date); return $diff > 86400 ? $date : ($diff > 3600 ? ($diff / 3600).' hours' : ($diff / 60).' minutes'); } echo timePassed('2009-12-29 16:30:00'); 

Non sono sicuro se questo è buono per la leggibilità, però.

Potresti semplicemente mescolare le if in un interruttore se sei interessato al layout.

Per esempio:

 $now = date("omd H:i:s") //now = something like '2009-12-28 16:39:00' $dateExample = '2009-12 16:37:00' $timeSpan = round(strtotime($now) - strtotime($dateExample)); switch(true) { case (($timeSpan/60)<=60): { echo $timeSpan." minutes"; break; } case (($timeSpan/(60*60))<=24): { echo ($timeSpan/(60*60))." Hours"; break; } default: { echo $dateExample; } } 

Detto questo, questo è solo zucchero sintattico.

Se sei preoccupato che il codice sia chiaro per i lettori della function di conversione della data della tua biblioteca, puoi prendere in considerazione questo modo (riscrivendo la function pubblicata da thephpdeveloper):

 function timepass($dt){ $timeSpan = round(time() - (is_int($dt) ? $dt : strtotime($dt))); $hours = intval($timeSpan / SECONDS_PER_HOUR); // define this somewhere $minutes = intval($timeSpan / SECONDS_PER_MINUTE); // define this somewhere if($hours == 0) { return $minutes.' minutes'; } else if($hours < 24) { return $hours.' hours'; } else { return ''; // your ISO date logic here } } 

Non vedo come si possa sbarazzarsi del if, ma personalmente trovo questo codice estremamente chiaro su quale sia la logica per select un formato da restituire e qual è il valore restituito in ciascun caso.

Ecco come ho finito per farlo.

 $now = date("omd H:i:s"); $timeSpan = round(strtotime($now) - strtotime($lastCheckIn)); $minuteCheck = round($timeSpan/60); $hourCheck = round($timeSpan/(60*60)); if($minuteCheck<=60) { echo $minuteCheck." minutes"; } else if($hourCheck<=24) { echo $hourCheck." hours"; } else { echo $lastCheckIn; } 

L'integer controllo minuto / ora rende davvero molto più chiaro l'IMO