<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><language>en-us</language><copyright>Copyright 2006</copyright><managingEditor>palrich@gmail.com</managingEditor><webMaster>palrich@gmail.com</webMaster><lastBuildDate>Sun, 05 Feb 2012 07:24:47 +0000</lastBuildDate><pubDate>Sun, 05 Feb 2012 07:24:47 +0000</pubDate><ttl>60</ttl><generator>WeirdLooking.com</generator><link>http://www.weirdlooking.com/</link><description>WeirdLooking.com: Michael Barton's Blog</description><title>WeirdLooking.com: Michael Barton's Blog</title><image><url>http://www.weirdlooking.com/images/feed.png</url><title>WeirdLooking.com: Michael Barton's Blog</title><link>http://www.weirdlooking.com/</link></image><item><title>human-readable date differences</title><dc:creator>Michael Barton</dc:creator><link>http://www.weirdlooking.com/blog/human-readable-date-differences</link><guid>http://www.weirdlooking.com/blog/human-readable-date-differences</guid><pubDate>Wed, 21 Dec 2005 11:29:32 +0000</pubDate><description>I had an idea today.&amp;nbsp; I wanted to include human-readable ages beside some of the dates on my blog (e.g. &amp;ldquo;1 day, 8 hours ago&amp;rdquo;).&amp;nbsp; I searched around a bit, and all of the solutions I found just divide the difference in seconds by 31536000 to get years and so on.&amp;nbsp; It doesn&amp;rsquo;t take leap years or different-sized months into account.&lt;br /&gt;&lt;br /&gt;Today is December 21, 2005.&amp;nbsp; To me, 2 years, 2 months ago was October 21, 2003.&lt;br /&gt;&lt;br /&gt;It took a while to write.&amp;nbsp; The first version used brute force to get the difference out of &lt;a href=&quot;http://www.php.net/mktime&quot; style=&quot;position: relative; padding-left: 8px; zoom: 1;&quot;&gt;&lt;span style=&quot;position: absolute; top: -5px; left: 0px; width: 16px; height: 16px; background: URL(http://www.weirdlooking.com/exticon?http%3A%2F%2Fwww.php.net%2Fmktime) no-repeat center center; -moz-opacity: 0.3; opacity: 0.3; filter:alpha(opacity=30);&quot;&gt;&lt;/span&gt;mktime&lt;/a&gt;.&amp;nbsp; That worked perfectly but was slow.&amp;nbsp; I used it to generate a bunch of test cases, though.&lt;br /&gt;&lt;br /&gt;What I eventually figured out is that you can just subtract the beginning years, months, hours, etc. from the current ones.&amp;nbsp; After that, use borrowing similar to long subtraction to get rid of any negative numbers.&amp;nbsp; Seconds borrow 60 from a minute, hours borrow 24 from a day, days borrow from an array of month lengths.&amp;nbsp; You get the idea.&amp;nbsp; Anyway, here&amp;rsquo;s the code, which I&amp;rsquo;ll post on the &lt;a href=&quot;http://smarty.incutio.com/?page=SmartyPlugins&quot; style=&quot;position: relative; padding-left: 8px; zoom: 1;&quot;&gt;&lt;span style=&quot;position: absolute; top: -5px; left: 0px; width: 16px; height: 16px; background: URL(http://www.weirdlooking.com/exticon?http%3A%2F%2Fsmarty.incutio.com%2F%3Fpage%3DSmartyPlugins) no-repeat center center; -moz-opacity: 0.3; opacity: 0.3; filter:alpha(opacity=30);&quot;&gt;&lt;/span&gt;SmartyPlugins wiki&lt;/a&gt; as soon as I figure out how.&lt;br /&gt;&lt;br /&gt;&lt;code style=&quot;display: block;&quot; class=&quot;blockocode&quot;&gt;&amp;lt;?php&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;color: #00B000&quot;&gt;/**&lt;br/&gt; * Smarty plugin&lt;br/&gt; * -----------------------------------------&lt;br/&gt; * File: &amp;nbsp; &amp;nbsp;modifier.human_age.php&lt;br/&gt; * Type: &amp;nbsp; &amp;nbsp;modifier&lt;br/&gt; * Name: &amp;nbsp; &amp;nbsp;human_age&lt;br/&gt; * Params: &amp;nbsp;from_time &amp;nbsp; &amp;nbsp;unix timestamp (required)&lt;br/&gt; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;to_time &amp;nbsp; &amp;nbsp; &amp;nbsp;unix timestamp (default=false (means now))&lt;br/&gt; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;strip_zeroes remove units with zero values (&quot;0 days&quot;) (default=true)&lt;br/&gt; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;limit &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;limit the number of units returned (default=no limit)&lt;br/&gt; * Author: &amp;nbsp;Michael Barton (http://www.weirdlooking.com/email)&lt;br/&gt; * Purpose: Returns a human-readable difference between two times&lt;br/&gt; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.g. &quot;1 day, 8 hours, 48 minutes, 57 seconds&quot;&lt;br/&gt; * Remarks: Correct for leap years and different-sized months.&lt;br/&gt; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Well, my idea of correct. &amp;nbsp;Turns out it's slightly subjective.&lt;br/&gt; *&lt;br/&gt; * @link http://www.weirdlooking.com/blog/45&lt;br/&gt; * -----------------------------------------&lt;br/&gt; */&lt;/span&gt;&lt;br/&gt; &amp;nbsp;&lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;require_once&lt;/span&gt; $smarty-&gt;_get_plugin_filepath(&lt;span style=&quot;color: #00B000&quot;&gt;'shared'&lt;/span&gt;,&lt;span style=&quot;color: #00B000&quot;&gt;'make_timestamp'&lt;/span&gt;);&lt;br/&gt;&lt;br/&gt; &amp;nbsp;&lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;function&lt;/span&gt; smarty_modifier_human_age($from_time, $to_time = &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;false&lt;/span&gt;, $strip_zeroes = &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;true&lt;/span&gt;, $limit = &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;false&lt;/span&gt;)&lt;br/&gt; &amp;nbsp;{&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;if&lt;/span&gt; ($to_time === &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;false&lt;/span&gt;)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;$to_time = time();&lt;br/&gt; &amp;nbsp; &amp;nbsp;$order = &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;array&lt;/span&gt;(&lt;span style=&quot;color: #00B000&quot;&gt;'year'&lt;/span&gt;, &lt;span style=&quot;color: #00B000&quot;&gt;'mon'&lt;/span&gt;, &lt;span style=&quot;color: #00B000&quot;&gt;'mday'&lt;/span&gt;, &lt;span style=&quot;color: #00B000&quot;&gt;'hours'&lt;/span&gt;, &lt;span style=&quot;color: #00B000&quot;&gt;'minutes'&lt;/span&gt;, &lt;span style=&quot;color: #00B000&quot;&gt;'seconds'&lt;/span&gt;);&lt;br/&gt; &amp;nbsp; &amp;nbsp;$names = &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;array&lt;/span&gt;(&lt;span style=&quot;color: #00B000&quot;&gt;'year'&lt;/span&gt;, &lt;span style=&quot;color: #00B000&quot;&gt;'month'&lt;/span&gt;, &lt;span style=&quot;color: #00B000&quot;&gt;'week'&lt;/span&gt;, &lt;span style=&quot;color: #00B000&quot;&gt;'day'&lt;/span&gt;, &lt;span style=&quot;color: #00B000&quot;&gt;'hour'&lt;/span&gt;, &lt;span style=&quot;color: #00B000&quot;&gt;'minute'&lt;/span&gt;, &lt;span style=&quot;color: #00B000&quot;&gt;'second'&lt;/span&gt;);&lt;br/&gt; &amp;nbsp; &amp;nbsp;$sizes = &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;array&lt;/span&gt;(&lt;span style=&quot;color: #FF0000&quot;&gt;12&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;2&lt;/span&gt;=&gt;&lt;span style=&quot;color: #FF0000&quot;&gt;24&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;60&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;60&lt;/span&gt;);&lt;br/&gt; &amp;nbsp; &amp;nbsp;$month_lengths = &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;array&lt;/span&gt;(&lt;span style=&quot;color: #FF0000&quot;&gt;31&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;31&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;28&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;31&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;30&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;31&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;30&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;31&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;31&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;30&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;31&lt;/span&gt;, &lt;span style=&quot;color: #FF0000&quot;&gt;30&lt;/span&gt;);&lt;br/&gt; &amp;nbsp; &amp;nbsp;$from = getdate($from_time);&lt;br/&gt; &amp;nbsp; &amp;nbsp;$to = getdate($to_time);&lt;br/&gt; &amp;nbsp; &amp;nbsp;$delta = &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;array&lt;/span&gt;();&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;foreach&lt;/span&gt; ($order &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;as&lt;/span&gt; $unit)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;$delta[] = $to[$unit] - $from[$unit];&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;for&lt;/span&gt; ($i = &lt;span style=&quot;color: #FF0000&quot;&gt;5&lt;/span&gt;; $i &gt;= &lt;span style=&quot;color: #FF0000&quot;&gt;0&lt;/span&gt;; $i--)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;if&lt;/span&gt; ($delta[$i] &amp;lt; &lt;span style=&quot;color: #FF0000&quot;&gt;0&lt;/span&gt;)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$delta[$i-&lt;span style=&quot;color: #FF0000&quot;&gt;1&lt;/span&gt;]--;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;if&lt;/span&gt; ($i == &lt;span style=&quot;color: #FF0000&quot;&gt;2&lt;/span&gt; &amp;amp;&amp;amp; ($to[&lt;span style=&quot;color: #00B000&quot;&gt;'mon'&lt;/span&gt;] == &lt;span style=&quot;color: #FF0000&quot;&gt;3&lt;/span&gt; &amp;amp;&amp;amp; !($to[&lt;span style=&quot;color: #00B000&quot;&gt;'year'&lt;/span&gt;] % &lt;span style=&quot;color: #FF0000&quot;&gt;4&lt;/span&gt;)))&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$delta[$i] += &lt;span style=&quot;color: #FF0000&quot;&gt;29&lt;/span&gt;; &lt;span style=&quot;color: #00B000&quot;&gt;// fix this before the year 2100!!!&lt;/span&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;if&lt;/span&gt; ($i == &lt;span style=&quot;color: #FF0000&quot;&gt;2&lt;/span&gt;)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$delta[$i] += &amp;nbsp;$month_lengths[$to[&lt;span style=&quot;color: #00B000&quot;&gt;'mon'&lt;/span&gt;]-&lt;span style=&quot;color: #FF0000&quot;&gt;1&lt;/span&gt;];&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;else&lt;/span&gt;&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$delta[$i] += $sizes[$i-&lt;span style=&quot;color: #FF0000&quot;&gt;1&lt;/span&gt;];&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br/&gt; &amp;nbsp; &amp;nbsp;$delta[&lt;span style=&quot;color: #FF0000&quot;&gt;2&lt;/span&gt;] -= ($week = floor($delta[&lt;span style=&quot;color: #FF0000&quot;&gt;2&lt;/span&gt;]/&lt;span style=&quot;color: #FF0000&quot;&gt;7&lt;/span&gt;)) * &lt;span style=&quot;color: #FF0000&quot;&gt;7&lt;/span&gt;;&lt;br/&gt; &amp;nbsp; &amp;nbsp;$delta = &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;array&lt;/span&gt;($delta[&lt;span style=&quot;color: #FF0000&quot;&gt;0&lt;/span&gt;], $delta[&lt;span style=&quot;color: #FF0000&quot;&gt;1&lt;/span&gt;], $week, $delta[&lt;span style=&quot;color: #FF0000&quot;&gt;2&lt;/span&gt;], $delta[&lt;span style=&quot;color: #FF0000&quot;&gt;3&lt;/span&gt;], $delta[&lt;span style=&quot;color: #FF0000&quot;&gt;4&lt;/span&gt;], $delta[&lt;span style=&quot;color: #FF0000&quot;&gt;5&lt;/span&gt;]);&lt;br/&gt; &amp;nbsp; &amp;nbsp;$ret = &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;array&lt;/span&gt;();&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;foreach&lt;/span&gt; ($delta &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;as&lt;/span&gt; $i =&gt; $val)&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;if&lt;/span&gt; (($delta[$i] || !$strip_zeroes) &amp;amp;&amp;amp; ($limit === &lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;false&lt;/span&gt; || sizeof($ret) &amp;lt; $limit))&lt;br/&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$ret[] = $delta[$i].&lt;span style=&quot;color: #00B000&quot;&gt;' '&lt;/span&gt;.$names[$i].($delta[$i] == &lt;span style=&quot;color: #FF0000&quot;&gt;1&lt;/span&gt; ? &lt;span style=&quot;color: #00B000&quot;&gt;''&lt;/span&gt; : &lt;span style=&quot;color: #00B000&quot;&gt;'s'&lt;/span&gt;);&lt;br/&gt; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0000B0; font-weight: bold;&quot;&gt;return&lt;/span&gt; join(&lt;span style=&quot;color: #00B000&quot;&gt;', '&lt;/span&gt;, $ret);&lt;br/&gt; &amp;nbsp;}&lt;br/&gt;?&gt;&lt;/code&gt;</description><category>computers and internet</category><category>php</category><category>website</category><category>smarty</category><comments>http://www.weirdlooking.com/blog/human-readable-date-differences#comments</comments><wfw:comment>http://www.weirdlooking.com/comments/45</wfw:comment><wfw:commentRss>http://www.weirdlooking.com/rss/comments/45</wfw:commentRss><slash:comments>6</slash:comments></item></channel></rss>
