a tiny mvc framework for php using php-activerecord
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?>