<?xml version="1.0" encoding="UTF-8"?>
<code>
  <code>/***
* Beautify date to how recent the event occurred compared to now.
* Some examples:  1 second, 4 hours, 10 days, 1 year.
*	Example:
*   var oneFiftyMin = new Date(new Date().getTime() - 60000 * 150);
*   alert(oneFiftyMin.when()); // will display "2 hours"
*
*  Handy for things like "Item posted " + someDate.when() + " ago."
*/
Date.prototype.when = function() {

	var diff = new Date().getTime() - this.getTime();
	var when; // our return value

	//TODO:  what if the time is in the future? 
	//if (diff &lt; 0) throw new Error ("Date is in future, check timezone?";

	//one or more of these will be non-zero, but we only care about the biggest one (in scale of time)
  var secondsOld = Math.floor(diff / 1000);
  var minutesOld = Math.floor(diff / 60000);
  var hoursOld   = Math.floor(diff / 3600000);
  var daysOld    = Math.floor(diff / 86400000);
	var monthsOld  = Math.floor(diff / 2592000000);
	var yearsOld   = Math.floor(diff / (2592000000 * 12));  //your content is old!

	//determine which value is non-zero and assign appropriate text
  if (yearsOld &gt; 0) {
		when = yearsOld + " year";
  }
  else if (monthsOld &gt; 0) {
		when = monthsOld + " month";
  }
  else if (daysOld &gt; 0) {
		when = daysOld + " day";
  }
  else if (hoursOld &gt; 0) {
		when = hoursOld + " hour";
  }
  else if (minutesOld &gt; 0) {
		when = minutesOld + " minute";
  }
  else {
		when = Math.round(diff /1000) + " second";
	}

	//add plural if necessary
	return (0 == when.indexOf("1 ")) ? when : when + "s";
} 
</code>
  <comment>This adds a .when() method to Date() object allowing you do things such as "Posted " + someDate.when() + " ago." and get output such as "Posted 10 minutes ago."  I've refactored it twice but would like to see it even smaller.</comment>
  <created-at type="datetime">2007-10-01T09:55:17+00:00</created-at>
  <id type="integer">37</id>
  <language>JavaScript</language>
  <permalink>beautify-js-date-to-how-recently-the-event-occured</permalink>
  <refactors-count type="integer">13</refactors-count>
  <title>Beautify JS Date to how recently the event occured.</title>
  <trackback-url></trackback-url>
  <updated-at type="datetime">2009-05-02T02:12:53+00:00</updated-at>
  <user-id type="integer">13</user-id>
  <refactors type="array">
    <refactor>
      <code>/***
* Beautify date to how recent the event occurred compared to now.
* Some examples:  1 second, 4 hours, 10 days, 1 year.
*	Example:
*   var oneFiftyMin = new Date(new Date().getTime() - 60000 * 150);
*   alert(oneFiftyMin.when()); // will display "2 hours"
*
*  Handy for things like "Item posted " + someDate.when() + " ago."
*/
Date.prototype.when = function() {

	var diff = new Date().getTime() - this.getTime();
	var when; // our return value

	//TODO:  what if the time is in the future? 
	//if (diff &lt; 0) throw new Error ("Date is in future, check timezone?";

	//one or more of these will be non-zero, but we only care about the biggest one (in scale of time)
  if (diff &gt; (2592000000 * 12) ) {
    when = Math.floor(diff/(2592000000 * 12)) + " Year";
  }
  else if (diff &gt; 2592000000) {
    when = Math.floor(diff/2592000000) + " Month";
  }
  else if (diff &gt; 86400000) {
    when = Math.floor(diff/86400000) + " Day";
  }
  else if (diff &gt; 3600000) {
    when = Math.floor(diff/3600000) + " Hour";
  }
  else if (diff &gt; 60000) {
    when = Math.floor(diff/60000) + " Minute";
  }
  else if (diff &gt; 1000) {
    when = Math.floor(diff/1000) + " Second";
  }

  //add plural if necessary
  return (0 == when.indexOf("1 ")) ? when : when + "s";
}</code>
      <code-id type="integer">37</code-id>
      <comment></comment>
      <created-at type="datetime">2007-10-01T13:56:14+00:00</created-at>
      <id type="integer">168</id>
      <language>JavaScript</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer">84</user-id>
      <user-name>typefreak</user-name>
      <user-website></user-website>
    </refactor>
    <refactor>
      <code>Date.prototype.when = function( ){
	// Create some string consisting of a number and a unit for it. If the
	// number is smaller than 0 we are not going to return anything. In case the
	// number is 1 were not going to append a extra "s" to the unit. When the 
	// number is greater than 1 we'll stick an extra s to the unit.
	function createGroup( no, unit ){
		return no &gt; 0 ? 
			" " + ( no &gt; 1 ? no.toString() + " " + unit.toString() + "s" : no.toString() + " " + unit.toString() ) : "";			
	}

	var diff = new Date( ( new Date() ).getTime() );
		
	
	return (
		createGroup( diff.getYear(),		"year" ) +
		createGroup( diff.getMonth() + 1,	"month" ) +
		createGroup( diff.getDate(),		"day" ) +
		createGroup( diff.getHours(),		"hour" ) +
		createGroup( diff.getMinutes(),		"minute" ) +
		createGroup( diff.getSeconds(),		"second" ) +
		createGroup( diff.getMilliseconds(), " millisecond" )
	);
};</code>
      <code-id type="integer">37</code-id>
      <comment>First submission hope you like it =)</comment>
      <created-at type="datetime">2007-10-01T18:17:46+00:00</created-at>
      <id type="integer">178</id>
      <language>JavaScript</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer" nil="true"></user-id>
      <user-name>Andre Steenveld</user-name>
      <user-website></user-website>
    </refactor>
    <refactor>
      <code></code>
      <code-id type="integer">37</code-id>
      <comment>Wow guys, I'm impressed!  Typefreak's does a great job in being efficient operationally while Andre's appears to do the best job at exploiting the Date object itself.  I'm impressed!</comment>
      <created-at type="datetime">2007-10-01T18:28:28+00:00</created-at>
      <id type="integer">179</id>
      <language>JavaScript</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer">13</user-id>
      <user-name>furtive</user-name>
      <user-website nil="true"></user-website>
    </refactor>
    <refactor>
      <code>Date.prototype.when = function( ){
	// Create some string consisting of a number and a unit for it. If the
	// number is smaller than 0 we are not going to return anything. In case the
	// number is 1 were not going to append a extra "s" to the unit. When the 
	// number is greater than 1 we'll stick an extra s to the unit.
	function createGroup( no, unit ){
		return no &gt; 0 ? 
			" " + ( no &gt; 1 ? no.toString() + " " + unit.toString() + "s" : no.toString() + " " + unit.toString() ) : "";			
	}

	var diff = new Date( ( new Date() ).getTime() - this.getTime() );
		
	
	return (
		createGroup( diff.getFullYear() - 1970,		"year" ) +
		createGroup( diff.getMonth(),				"month" ) +
		createGroup( diff.getDate() - 1,			"day" ) +
		createGroup( diff.getHours() - 1,			"hour" ) +
		createGroup( diff.getMinutes() - 1,			"minute" ) +
		createGroup( diff.getSeconds() - 1,			"second" ) +
		createGroup( diff.getMilliseconds() - 1,	" millisecond" )
	);
};</code>
      <code-id type="integer">37</code-id>
      <comment>Didn't test it properly here is a "fixed" version...</comment>
      <created-at type="datetime">2007-10-01T18:32:01+00:00</created-at>
      <id type="integer">180</id>
      <language>JavaScript</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer" nil="true"></user-id>
      <user-name>Andre Steenveld</user-name>
      <user-website></user-website>
    </refactor>
    <refactor>
      <code>Date.prototype.when = function(){
	var diff = (new Date() - this)/1e3;
	var a = {'second':60, 'minute':60, 'hour':24, 'day':30, 'month':365, 'year':365}; // a small hack here - won't display correctly if difference &gt; 365 years
	for(var i in a){
		diff/=a[i];
		if(diff&lt;1){
			return Math.floor(diff*=a[i])+' '+i+(diff&gt;1?'s':0);
		}
	}
}</code>
      <code-id type="integer">37</code-id>
      <comment>I'm not sure if it works, but here's a different idea:</comment>
      <created-at type="datetime">2007-10-02T06:09:57+00:00</created-at>
      <id type="integer">195</id>
      <language>JavaScript</language>
      <rating type="integer">2</rating>
      <ratings-count type="integer">1</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer" nil="true"></user-id>
      <user-name>Tomasz Ko&#197;&#8218;odziejski</user-name>
      <user-website>neo.mlodzi.pl</user-website>
    </refactor>
    <refactor>
      <code>Date.prototype.when = function(){
    var diff = ( ( new Date(0) ).getTime() - this.getTime() ) / 1000,
        units = [ "second", "minute", "hour", "day", "weeks", "month", "year" ],
        size  = [ 1,        60,       60,      24,   7,       4.333,   12     ];
	
    for( var i = 0; i &lt; units.length; i++ ){
        diff /= size[ i ];
        if( diff &lt; 1 )
            return Math.floor( diff *= size[ i ] ) + " " + units[ i - 1 ] + ( diff &gt; 1 ? "s" : "" );	
    }
};
</code>
      <code-id type="integer">37</code-id>
      <comment>I was very very impressed by Tomasz's idea so I worked it out. I used two arrays instead of an object because there is no way to guarantee how a for-in loop will itterate through an object. You can shave off another line by putting unit and size in one array and using split() to get your int or your unit name.</comment>
      <created-at type="datetime">2007-10-02T14:02:29+00:00</created-at>
      <id type="integer">209</id>
      <language>JavaScript</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer" nil="true"></user-id>
      <user-name>Andre Steenveld</user-name>
      <user-website></user-website>
    </refactor>
    <refactor>
      <code>Date.prototype.when = function(){
	var diff = ( ( new Date(0) ).getTime() - this.getTime() ) / 1000,
		units = [ "60|second", "60|minute", "24|hour", "7|day", "4.333|week", "12|month", "1|year" ];
	
	for( var i = 0; i &lt; units.length &amp;&amp; !( diff &lt; 1 || ( i + 1 ) === units.length ); i++ )
		diff /= units[ i ].split("|")[ 0 ];
		
	return Math.floor( diff *= units[ i ].split("|")[ 0 ] ) + " " + units[ i ].split("|")[ 1 ] + ( diff &gt; 1 ? "s" : "" ) + "[ " + i + " ]";
};</code>
      <code-id type="integer">37</code-id>
      <comment>Any short than this would be impossible i think...</comment>
      <created-at type="datetime">2007-10-02T16:06:22+00:00</created-at>
      <id type="integer">213</id>
      <language>JavaScript</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer" nil="true"></user-id>
      <user-name>Andre Steenveld</user-name>
      <user-website></user-website>
    </refactor>
    <refactor>
      <code>Date.prototype.when = function(){
	var diff = (new Date() - this)/1e3,
	u = [ "second", "minute", "hour", "day", "weeks", "month", "year" ],
        s = [ 1, 60, 60, 24, 7, 4.333, 12, 1e9], // again fast hack - 1e9
        i=0;
	
	for(;;i++){
		if((diff/=s[i])&lt;1){
			return ~~(diff*=s[i])+' '+u[i-1]+(diff&gt;1?'s':0);
		}
	}
	
}</code>
      <code-id type="integer">37</code-id>
      <comment>I think that using the getTime function isn't necessary. Separating these two arrays would be much better I think and easier to modifying. In the 8 line we can use ~~. </comment>
      <created-at type="datetime">2007-10-03T06:20:35+00:00</created-at>
      <id type="integer">241</id>
      <language>JavaScript</language>
      <rating type="integer">4</rating>
      <ratings-count type="integer">2</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer">116</user-id>
      <user-name>Tomasz `neo` Ko&#197;&#8218;odziejski</user-name>
      <user-website>http://neo.mlodzi.pl/</user-website>
    </refactor>
    <refactor>
      <code></code>
      <code-id type="integer">37</code-id>
      <comment>Tomasz! Nice little bit of javascript there. Trying to search for some tuts on the "~~" and I'm not finding anything... Does anyone know where I can find out more about it? What does it do?</comment>
      <created-at type="datetime">2007-10-12T09:15:55+00:00</created-at>
      <id type="integer">394</id>
      <language>JavaScript</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer">186</user-id>
      <user-name>richardhealy</user-name>
      <user-website></user-website>
    </refactor>
    <refactor>
      <code></code>
      <code-id type="integer">37</code-id>
      <comment>It's a bitwise operation what i basically does in this situation is cut of evrything after the decimal point. </comment>
      <created-at type="datetime">2007-10-17T11:38:57+00:00</created-at>
      <id type="integer">452</id>
      <language>JavaScript</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer">131</user-id>
      <user-name>Andre Steenveld</user-name>
      <user-website></user-website>
    </refactor>
    <refactor>
      <code>Date.prototype.when = function(){
  var diff = (new Date() - this) / 1e3;
  var u = [ "second", "minute", "hour", "day", "week", "month", "year" ];
  var s = [ 1, 60, 60, 24, 7, 4.333, 12, 1e9 ]; // 1e9 = hack for speed

  for (var i in s)
    if ((diff /= s[i]) &lt; 1)
      return ~~ (diff *= s[i]) + " " + u[i-1] + (diff &gt; 1 ? "s" : "");
}</code>
      <code-id type="integer">37</code-id>
      <comment>Hope the date's not in the future...</comment>
      <created-at type="datetime">2008-02-07T18:22:32+00:00</created-at>
      <id type="integer">2167</id>
      <language>JavaScript</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer">482</user-id>
      <user-name>hubfactor</user-name>
      <user-website>http://hublog.hubmed.org/</user-website>
    </refactor>
    <refactor>
      <code nil="true"></code>
      <code-id type="integer">37</code-id>
      <comment>Hello I am new here. Greetings From Poland
&lt;a href=http://autocarauctions.hostscorpion.com/cheap-fast-cars.html&gt;&lt;img&gt;http://www.clicksmilies.com/auswahl/ernaehrung004.gif&lt;/img&gt;&lt;/a&gt;</comment>
      <created-at type="datetime">2009-04-26T12:11:15+00:00</created-at>
      <id type="integer">155808</id>
      <language>JavaScript</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer" nil="true"></user-id>
      <user-name>polishboy</user-name>
      <user-website>http://autocarauctions.hostscorpion.com/cheap-fast-cars.html</user-website>
    </refactor>
    <refactor>
      <code nil="true"></code>
      <code-id type="integer">37</code-id>
      <comment>http://buyseizedcars.wordpress.com/2009/04/29/repo-car-auctions/ - Capital Auto Auction
&lt;a href="http://buyseizedcars.wordpress.com/2009/04/29/repo-car-auctions/"&gt;Capital Auto Auction&lt;/a&gt;
Repo Car Auctions - http://buyseizedcars.wordpress.com/2009/04/29/repo-car-auctions/</comment>
      <created-at type="datetime">2009-05-02T02:12:45+00:00</created-at>
      <id type="integer">156110</id>
      <language>JavaScript</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On Beautify JS Date to how recently the event occured.</title>
      <user-id type="integer" nil="true"></user-id>
      <user-name>repocarauctions</user-name>
      <user-website>http://buyseizedcars.wordpress.com/</user-website>
    </refactor>
  </refactors>
</code>
