Date.prototype.setISO8601 = function (string) {
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" + "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" + "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
}

Date.prototype.getNiceDate = function() {
    var nice = this.getDate();
    switch(this.getDate())
    {
    case 1: nice += 'st '; break;
    case 2: nice += 'nd '; break;
    case 3: nice += 'rd '; break;
    case 21: nice += 'st '; break;
    case 22: nice += 'nd '; break;
    case 23: nice += 'rd '; break;
    case 31: nice += 'st '; break;
    default: nice += 'th ';
    }
    switch(this.getMonth())
    {
    case 0: nice += 'January '; break;
    case 1: nice += 'February '; break;
    case 2: nice += 'March '; break;
    case 3: nice += 'April '; break;
    case 4: nice += 'May '; break;
    case 5: nice += 'June '; break;
    case 6: nice += 'July '; break;
    case 7: nice += 'August '; break;
    case 8: nice += 'September '; break;
    case 9: nice += 'October '; break;
    case 10: nice += 'November '; break;
    case 11: nice += 'December '; break;
    }
    nice+=this.getFullYear();
    return nice

}
