a tiny mvc framework for php using php-activerecord
at master 88 lines 3.0 kB view raw
1<?php 2/* 3 time and date-related helpers 4*/ 5 6namespace HalfMoon; 7 8class TimeHelper extends Helper { 9 /* reports the approximate distance between two times */ 10 public function distance_of_time_in_words($from_time, $to_time = 0, 11 $include_seconds = false) { 12 if (!in_array(get_class($from_time), array("DateTime", 13 "ActiveRecord\\DateTime"))) 14 $from_time = new \DateTime($from_time); 15 16 if (!in_array(get_class($to_time), array("DateTime", 17 "ActiveRecord\\DateTime"))) 18 $to_time = new \DateTime($to_time); 19 20 $seconds_diff = intval($to_time->format("U")) - 21 intval($from_time->format("U")); 22 23 $distance_in_minutes = round(abs($seconds_diff / 60)); 24 $distance_in_seconds = round(abs($seconds_diff)); 25 26 if (Utils::is_or_between($distance_in_minutes, array(0, 1))) { 27 if (!$include_seconds) 28 return ($distance_in_minutes == 0 ? "less than 1 minute" : 29 $distance_in_minutes . " minute" 30 . ($distance_in_minutes == 1 ? "" : "s")); 31 32 if (Utils::is_or_between($distance_in_seconds, array(0, 4))) 33 return "less than 5 seconds"; 34 elseif (Utils::is_or_between($distance_in_seconds, array(5, 9))) 35 return "less than 10 seconds"; 36 elseif (Utils::is_or_between($distance_in_seconds, array(10, 19))) 37 return "less than 20 seconds"; 38 elseif (Utils::is_or_between($distance_in_seconds, array(20, 39))) 39 return "less than half a minute"; 40 else 41 return "1 minute"; 42 } 43 44 elseif (Utils::is_or_between($distance_in_minutes, array(2, 44))) 45 return $distance_in_minutes . " minutes"; 46 47 elseif (Utils::is_or_between($distance_in_minutes, array(45, 89))) 48 return "about 1 hour"; 49 50 elseif (Utils::is_or_between($distance_in_minutes, array(90, 1439))) 51 return "about " . round($distance_in_minutes / 60) . " hours"; 52 53 elseif (Utils::is_or_between($distance_in_minutes, array(1440, 2879))) 54 return "about 1 day"; 55 56 elseif (Utils::is_or_between($distance_in_minutes, array(2880, 43199))) 57 return "about " . round($distance_in_minutes / 1440) . " days"; 58 59 elseif (Utils::is_or_between($distance_in_minutes, array(43200, 86399))) 60 return "about 1 month"; 61 62 elseif (Utils::is_or_between($distance_in_minutes, array(86400, 525599))) 63 return "about " . round($distance_in_minutes / 43200) . " months"; 64 65 elseif (Utils::is_or_between($distance_in_minutes, array(525600, 1051199))) 66 return "about 1 year"; 67 68 else 69 return "over " . round($distance_in_minutes / 525600) . " years"; 70 } 71 72 /* like distance_of_time_in_words, but where to_time is fixed to now */ 73 public function time_ago_in_words($from_time, $include_seconds = false) { 74 $now_gmt = new \DateTime("now", new \DateTimeZone("UTC")); 75 76 if (in_array(get_class($from_time), 77 array("DateTime", "ActiveRecord\\DateTime"))) { 78 $from_gmt = clone($from_time); 79 $from_gmt->setTimezone(new \DateTimeZone("UTC")); 80 } elseif (is_int($from_time)) 81 $from_gmt = new \DateTime("@" . $from_time, new \DateTimeZone("UTC")); 82 83 return TimeHelper::distance_of_time_in_words($from_gmt, $now_gmt, 84 $include_seconds); 85 } 86} 87 88?>