Skip to content

Instantly share code, notes, and snippets.

@fauxparse
Created December 21, 2011 23:20
Show Gist options
  • Save fauxparse/1508172 to your computer and use it in GitHub Desktop.
Save fauxparse/1508172 to your computer and use it in GitHub Desktop.

Revisions

  1. fauxparse revised this gist Dec 21, 2011. 1 changed file with 142 additions and 0 deletions.
    142 changes: 142 additions & 0 deletions date.coffee.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,142 @@
    // Automatically compiled to JavaScript

    var __hasProp = Object.prototype.hasOwnProperty;

    Number.prototype.pad = function(digits, signed) {
    var s;
    s = Math.abs(this).toString();
    while (s.length < digits) {
    s = "0" + s;
    }
    return (this < 0 ? "-" : (signed ? "+" : "")) + s;
    };

    Date.months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

    Date.weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

    Date.formats = {
    "a": function() {
    return Date.weekdays[this.getDay()].substring(0, 3);
    },
    "A": function() {
    return Date.weekdays[this.getDay()];
    },
    "b": function() {
    return Date.months[this.getMonth()].substring(0, 3);
    },
    "B": function() {
    return Date.months[this.getMonth()];
    },
    "c": function() {
    return this.toLocaleString();
    },
    "d": function() {
    return this.getDate().toString();
    },
    "F": function() {
    return "" + (this.getFullYear()) + "-" + (this.getMonth() + 1) + "-" + (this.getDate());
    },
    "H": function() {
    return this.getHours().pad(2);
    },
    "I": function() {
    return "" + ((this.getHours() % 12) || 12);
    },
    "j": function() {
    return this.getDayOfYear();
    },
    "L": function() {
    return this.getMilliseconds().pad(3);
    },
    "m": function() {
    return (this.getMonth() + 1).pad(2);
    },
    "M": function() {
    return this.getMinutes().pad(2);
    },
    "N": function() {
    return this.getMilliseconds().pad(3);
    },
    "p": function() {
    if (this.getHours() < 12) {
    return "AM";
    } else {
    return "PM";
    }
    },
    "P": function() {
    if (this.getHours() < 12) {
    return "am";
    } else {
    return "pm";
    }
    },
    "S": function() {
    return this.getSeconds().pad(2);
    },
    "s": function() {
    return Math.floor(this.getTime() / 1000);
    },
    "U": function() {
    return this.getWeekOfYear();
    },
    "w": function() {
    return this.getDay();
    },
    "W": function() {
    return this.getWeekOfYear(1);
    },
    "y": function() {
    return this.getFullYear() % 100;
    },
    "Y": function() {
    return this.getFullYear();
    },
    "x": function() {
    return this.toLocaleDateString();
    },
    "X": function() {
    return this.toLocaleTimeString();
    },
    "z": function() {
    var z;
    return Math.floor((z = -this.getTimezoneOffset()) / 60).pad(2, true) + (Math.abs(z) % 60).pad(2);
    },
    "Z": function() {
    return /\(([^\)]*)\)$/.exec(this.toString())[1];
    }
    };

    Date.prototype.format = function(fmt) {
    var callback, char, part, parts, r, _ref;
    parts = (fmt || "%c").split("%%");
    _ref = Date.formats;
    for (char in _ref) {
    if (!__hasProp.call(_ref, char)) continue;
    callback = _ref[char];
    r = new RegExp("%" + char, "g");
    parts = (function() {
    var _i, _len, _results,
    _this = this;
    _results = [];
    for (_i = 0, _len = parts.length; _i < _len; _i++) {
    part = parts[_i];
    _results.push(part.replace(r, function() {
    return callback.apply(_this);
    }));
    }
    return _results;
    }).call(this);
    }
    return parts.join("%");
    };

    Date.prototype.getDayOfYear = function() {
    return Math.ceil((this.getTime() - new Date(this.getFullYear(), 0, 1).getTime()) / 24 / 60 / 60 / 1000);
    };

    Date.prototype.getWeekOfYear = function(start) {
    if (start == null) start = 0;
    return Math.floor((this.getDayOfYear() - (start + 7 - new Date(this.getFullYear(), 0, 1).getDay()) % 7) / 7) + 1;
    };
  2. fauxparse created this gist Dec 21, 2011.
    48 changes: 48 additions & 0 deletions date.coffee
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,48 @@
    Number::pad = (digits, signed) ->
    s = Math.abs(@).toString()
    s = "0" + s while s.length < digits
    (if @ < 0 then "-" else (if signed then "+" else "")) + s

    Date.months = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]
    Date.weekdays = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]

    Date.formats =
    "a": -> Date.weekdays[@getDay()].substring(0, 3)
    "A": -> Date.weekdays[@getDay()]
    "b": -> Date.months[@getMonth()].substring(0, 3)
    "B": -> Date.months[@getMonth()]
    "c": -> @toLocaleString()
    "d": -> @getDate().toString()
    "F": -> "#{@getFullYear()}-#{@getMonth() + 1}-#{@getDate()}"
    "H": -> @getHours().pad(2)
    "I": -> "#{(@getHours() % 12) || 12}"
    "j": -> @getDayOfYear()
    "L": -> @getMilliseconds().pad(3)
    "m": -> (@getMonth() + 1).pad(2)
    "M": -> @getMinutes().pad(2)
    "N": -> @getMilliseconds().pad(3)
    "p": -> if @getHours() < 12 then "AM" else "PM"
    "P": -> if @getHours() < 12 then "am" else "pm"
    "S": -> @getSeconds().pad(2)
    "s": -> Math.floor(@getTime() / 1000)
    "U": -> @getWeekOfYear()
    "w": -> @getDay()
    "W": -> @getWeekOfYear(1)
    "y": -> @getFullYear() % 100
    "Y": -> @getFullYear()
    "x": -> @toLocaleDateString()
    "X": -> @toLocaleTimeString()
    "z": -> Math.floor((z = -@getTimezoneOffset()) / 60).pad(2, true) + (Math.abs(z) % 60).pad(2)
    "Z": -> /\(([^\)]*)\)$/.exec(@toString())[1]

    Date::format = (fmt) ->
    parts = (fmt || "%c").split "%%"
    for own char, callback of Date.formats
    r = new RegExp("%#{char}", "g")
    parts = (part.replace(r, => callback.apply(this)) for part in parts)
    parts.join "%"

    Date::getDayOfYear = -> Math.ceil((@getTime() - new Date(@getFullYear(), 0, 1).getTime()) / 24 / 60 / 60 / 1000)

    Date::getWeekOfYear = (start = 0) ->
    Math.floor((@getDayOfYear() - (start + 7 - new Date(@getFullYear(), 0, 1).getDay()) % 7) / 7) + 1