Skip to content

Instantly share code, notes, and snippets.

@andyperlitch
Created October 26, 2013 00:12
Show Gist options
  • Save andyperlitch/7163757 to your computer and use it in GitHub Desktop.
Save andyperlitch/7163757 to your computer and use it in GitHub Desktop.

Revisions

  1. andyperlitch created this gist Oct 26, 2013.
    72 changes: 72 additions & 0 deletions gistfile1.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,72 @@
    function timeSince(timeStamp, options) {
    if (typeof timeStamp === "object") {
    options = timeStamp;
    timeStamp = undefined;
    }
    options = options || {};
    _.defaults(options, {
    compareDate: +new Date(),
    timeChunk: undefined,
    maxUnit: "year",
    unixUptime: false,
    max_levels: 3,
    timeStamp: timeStamp || 0
    });
    var remaining = (options.timeChunk !== undefined) ? options.timeChunk : options.compareDate - options.timeStamp;
    var string = "";
    var separator = ", ";
    var level = 0;
    var max_levels = options.max_levels;
    var milli_per_second = 1000;
    var milli_per_minute = milli_per_second * 60;
    var milli_per_hour = milli_per_minute * 60;
    var milli_per_day = milli_per_hour * 24;
    var milli_per_week = milli_per_day * 7;
    var milli_per_month = milli_per_week * 4;
    var milli_per_year = milli_per_day * 365;

    if (options.unixUptime) {
    var days = Math.floor(remaining / milli_per_day);
    remaining -= days*milli_per_day;
    var hours = Math.floor(remaining / milli_per_hour);
    remaining -= hours*milli_per_hour;
    var minutes = Math.round(remaining / milli_per_minute);

    if (days === 0) {
    minutes = Math.floor(remaining / milli_per_minute);
    remaining -= minutes*milli_per_minute;
    var seconds = Math.round(remaining / 1000);
    string = (hours < 10 ? "0" : "")+hours+':'+(minutes < 10 ? "0" : "")+minutes+':'+(seconds < 10 ? "0" : "")+seconds;
    }
    else {
    string = days + " days, " + hours.toString() + ":" + (minutes < 10 ? "0" : "") + minutes.toString();
    }

    } else {
    var levels = [
    { plural: "years", singular: "year", ms: milli_per_year },
    { plural: "months", singular: "month", ms: milli_per_month },
    { plural: "weeks", singular: "week", ms: milli_per_week },
    { plural: "days", singular: "day", ms: milli_per_day },
    { plural: "hours", singular: "hour", ms: milli_per_hour },
    { plural: "minutes", singular: "minute", ms: milli_per_minute },
    { plural: "seconds", singular: "second", ms: milli_per_second }
    ];

    var crossedThreshold = false;
    for (var i=0; i < levels.length; i++) {
    if ( options.maxUnit === levels[i].singular ) crossedThreshold = true;
    if ( remaining < levels[i].ms || !crossedThreshold ) continue;
    level++;
    var num = Math.floor( remaining / levels[i].ms );
    var label = num == 1 ? levels[i].singular : levels[i].plural ;
    string += num + " " + label + separator;
    remaining %= levels[i].ms;
    if ( level >= max_levels ) break;
    };
    string = string.substring(0, string.length - separator.length);
    }


    return string;
    }