Skip to content

Commit

Permalink
initial
Browse files Browse the repository at this point in the history
  • Loading branch information
azer committed Mar 9, 2011
0 parents commit 8ffa4aa
Show file tree
Hide file tree
Showing 6 changed files with 193 additions and 0 deletions.
31 changes: 31 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
Javascript module for outputting relative dates. Tested platforms: Node, Firefox 3.6, Chromium 8.0

Install
=======
npm install relative-date

Usage
=====
On browsers:

<script src="relative-date.js"></script>
<script>
assert( relativeDate(new Date()), 'just now' );
assert( relativeDate(1299627946000), '12 minutes ago');
assert( relativeDate(0), '41 years ago');
</script>

On a CommonJS compliant environment:

> var relativeDate = require('relative-date');
> relativeDate(new Date())
'just now'
> relativeDate(1299627946000)
'12 minutes ago'
> relativeDate(0)
'41 years ago'

Testing
=======
node test/node.js
test/browser.html
50 changes: 50 additions & 0 deletions lib/relative-date.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
var relativeDate = (function(undefined){

var SECOND = 1000,
MINUTE = 60 * SECOND,
HOUR = 60 * MINUTE,
DAY = 24 * HOUR,
WEEK = 7 * DAY,
YEAR = DAY * 365,
MONTH = YEAR / 12;

var formats = [
[ 0.7 * MINUTE, 'just now' ],
[ 1.5 * MINUTE, 'a minute ago' ],
[ 60 * MINUTE, 'minutes ago', MINUTE ],
[ 1.5 * HOUR, 'an hour ago' ],
[ 0.7 * DAY, 'hours ago', HOUR ],
[ DAY, 'today'],
[ 2 * DAY, 'yesterday' ],
[ 7 * DAY, 'days ago', DAY ],
[ 1.5 * WEEK, 'a week ago'],
[ MONTH, 'weeks ago', WEEK ],
[ 1.5 * MONTH, 'a month ago' ],
[ YEAR, 'months ago', MONTH ],
[ 1.5 * YEAR, 'a year ago' ],
[ Number.MAX_VALUE, 'years ago', YEAR ]
];

function relativeDate(input,reference){
!reference && ( reference = (new Date).getTime() );
reference instanceof Date && ( reference = reference.getTime() );
input instanceof Date && ( input = input.getTime() );

var delta = reference - input,
format, i, len;

for(i = -1, len=formats.length; ++i < len; ){
format = formats[i];
if(delta < format[0]){
return format[2] == undefined ? format[1] : Math.round(delta/format[2]) + ' ' + format[1];
}
};
}

return relativeDate;

})();

if(typeof module != 'undefined' && module.exports){
module.exports = relativeDate;
}
32 changes: 32 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"name": "relative-date",
"version": "1.0.0",
"description": "Javascript module for outputting relative dates.",
"author": "Azer Koculu <azer@kodfabrik.com> (http://azer.kodfabrik.com)",
"keywords": [
"pretty",
"date",
"timestamp",
"format",
"human-readable",
"relative"
],
"directories": {
"lib": "./lib"
},
"main": "./lib/relative-date",
"engines": {
"node": "*"
},
"modules": {
"observer.js": "lib/relative-date.js"
},
"files": [
""
],
"homepage": "http://github.com/azer/relative-date",
"repository": { "type":"git", "url" : "http://github.com/azer/relative-date.git" },
"scripts": {
"test": "node test/node.js"
}
}
24 changes: 24 additions & 0 deletions test/browser.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script src="../lib/relative-date.js"></script>
<script src="test.js"></script>
<script>
var assert = {
'equal':function(){
if(arguments[0]!=arguments[1]){
throw new Error('Assertion Error: '+arguments[0]+'=='+arguments[1]);
}
}
}

try {
test();
alert('OK');
} catch(exc){
alert('FAIL');
}

</script>
</head>
</html>
7 changes: 7 additions & 0 deletions test/node.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
var test = require('./test'),
puts = require('sys').puts,
startTS = (new Date).getTime();

test();

puts('OK - '+( (new Date).getTime() - startTS )/1000+'s');
49 changes: 49 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
if(typeof require!='undefined'){
relativeDate = require('../lib/relative-date'),
assert = require('assert');
}

var SECOND = 1000,
MINUTE = 60 * SECOND,
HOUR = 60 * MINUTE,
DAY = 24 * HOUR,
WEEK = 7 * DAY,
YEAR = DAY * 365,
MONTH = YEAR / 12;

var reference = 157766400000, // 01.01.1975 00:00
spans = {
'just now':reference*SECOND,
'just now':reference-41*SECOND,
'a minute ago':reference-42*SECOND,
'a minute ago':reference-MINUTE,
'2 minutes ago':reference-MINUTE*1.5,
'59 minutes ago':reference-MINUTE*59,
'an hour ago':reference-HOUR,
'2 hours ago':reference-HOUR*1.5,
'16 hours ago':reference-HOUR*16,
'today':reference-HOUR*17,
'yesterday':reference-DAY*1.8,
'3 days ago':reference-DAY*3,
'6 days ago':reference-DAY*6,
'a week ago':reference-WEEK,
'2 weeks ago':reference-WEEK*2,
'4 weeks ago':reference-WEEK*4,
'a month ago':reference-MONTH*1.2,
'12 months ago':reference-YEAR+HOUR,
'a year ago':reference-YEAR,
'2 years ago':reference-YEAR*2,
'5 years ago': 0
};

function test(){
var now = (new Date).getTime();
assert.equal(relativeDate(0), Math.round(now/YEAR) + ' years ago' );

var key;
for(key in spans){
assert.equal(relativeDate(spans[key], reference), key);
}
}

typeof module != 'undefined' && ( module.exports = test );

0 comments on commit 8ffa4aa

Please sign in to comment.