title: How to use Date in Javascript for prehistoric dates?
body: <p>I’m working on a project where the JavaScript Date isn't big enough.</p>
  
  <p>I want to place multiple events on the same time axis, some of them have month and day and some don't, so just using year is not an option. I want to be able to have the moon landing and big bang on the same axis.</p>
  
  <p>It would help a lot if I could use the functionality that the existing Date object has. It only goes back 270,000 years and I need to go all the way back to big bang (13,800,000,000 years ago). I don’t need the dates to contain seconds or milliseconds.</p>
  
  <p><strong>How can I extend the Date object to include representation for such dates?</strong></p>
  
  <p>I have tried to find libraries or native functions for this but without luck. I also started looking for a JavaScript implementation of the Date object that I could modified, but I had no luck here either.</p>
  
  <p><strong>Update:</strong></p>
  
  <p>I started with remdevtec solution but ended up modifying it quite a lot. I wanted the dates to come in numeric order to make it easier sort and order the dates.</p>
  
  <p>So what I did was that if the year is before -100,000 I treat the millisecond value as hours. This is what i got so far, and it works in our project, but if I get more time I will clean it up and put it on github.</p>
  
  <p><a href="https://jsfiddle.net/w4uq1uhe/11/" rel="noreferrer">JSFiddle</a></p>
  
  <p><div class="snippet" data-lang="js" data-hide="true" data-console="false" data-babel="false">
  <div class="snippet-code snippet-currently-hidden">
  <pre class="snippet-code-js lang-js prettyprint-override"><code>function BigDate(date){
      if(!date){
          this.original = new Date(); 
      }else if(date instanceof BigDate){
          this.original = date.original;
      }else{
          this.original = new Date(date);  
      }
      this.yearBreakpoint = -100000;
      this.breakPoint = Date.UTC(this.yearBreakpoint,0,0).valueOf();
      this.factor = 360000;//needed for our project to make extra space on our axis
  }
  
  BigDate.UTC = function (year, month, day, hour, minute, second, millisecond) {
      var temp = new BigDate();
      if(year &lt; -temp.yearBreakpoint){
          temp.setUTCFullYear(year);
          return temp;
      }else{
          temp.original = Date.UTC(year,month,day,hour,minute,second,millisecond);
      }
      return temp.valueOf();
  };
  
  BigDate.now = function (){
      var temp = new BigDate();
      temp.original = Date.now();
      return temp.valueOf();
  };
  
  BigDate.parse = function (val){
      throw "not implemnted";
  };
  
  //custom functions
  
  BigDate.prototype.getUTCDate = function () {
     if(this.valueOf() &lt; this.breakPoint){
         return 0;
     }
     return this.original.getUTCDate();
  };
  BigDate.prototype.getUTCDay = function () {
     if(this.valueOf() &lt; this.breakPoint){
          return 0;
      }
      return this.original.getUTCDay();
  };
  BigDate.prototype.getUTCFullYear = function () {
      if(this.valueOf() &lt; this.breakPoint){
          return (this.valueOf() - this.breakPoint) / this.factor;
      }
      return this.original.getUTCFullYear();
  };
  BigDate.prototype.getUTCHours = function () {
      if(this.valueOf() &lt; this.breakPoint){
          return 0;
      }
      return this.original.getUTCHours();
  };
  BigDate.prototype.getUTCMilliseconds = function () {
      if(this.valueOf() &lt; this.breakPoint){
          return 0;
      }
      return this.original.getUTCMilliseconds();
  };
  BigDate.prototype.getUTCMinutes = function () {
      if(this.valueOf() &lt; this.breakPoint){
          return 0;
      }
      return this.original.getUTCMinutes();
  };
  BigDate.prototype.getUTCMonth = function () {
      if(this.valueOf() &lt; this.breakPoint){
          return 0;
      }
      return this.original.getUTCMonth();
  };
  BigDate.prototype.getUTCSeconds = function () {
      if(this.valueOf() &lt; this.breakPoint){
          return 0;
      }
      return this.original.getUTCSeconds();
  };
  
  BigDate.prototype.setUTCDate = function (val) {
      if(val &gt;= this.yearBreakpoint){
        return this.original.setUTCDate(val);
     }
  };
  BigDate.prototype.setUTCFullYear = function (val) {
      if(val &lt; this.yearBreakpoint){
          this.original.setTime((parseInt(val) * this.factor) + this.breakPoint);
      }else{
          this.original.setUTCFullYear(val);
      }
      return this.valueOf();
  };
  BigDate.prototype.setUTCHours = function (val) {
      if(val &gt;= this.yearBreakpoint){
        return this.original.setUTCHours(val);
      }
  };
  BigDate.prototype.setUTCMilliseconds = function (val) {
      if(val &gt;= this.yearBreakpoint){
        return this.original.setUTCMilliseconds(val);
      }
  };
  BigDate.prototype.setUTCMinutes = function (val) {
      if(val &gt;= this.yearBreakpoint){
          return this.original.setUTCMinutes(val);
      }
  };
  BigDate.prototype.setUTCMonth = function (val) {
      if(val &gt;= this.yearBreakpoint){
        return   this.original.setUTCMonth(val);
      }
  };
  BigDate.prototype.setUTCSeconds = function (val) {
      if(val &gt;= this.yearBreakpoint){
         return  this.original.setUTCSeconds(val);
      }
  };
  
  BigDate.prototype.setTime = function (val) {
      this.original.setTime(val);
      return this.valueOf();
  };
  BigDate.prototype.valueOf = function () {
      return this.original.valueOf();
  };
  
  
  BigDate.prototype.toDateString = function () {
      if(this.valueOf() &lt; this.breakPoint){
          return "Jan 01 " + this.getUTCFullYear();
      }
      return this.original.toDateString();
  };
  BigDate.prototype.toISOString = function () {
      if(this.valueOf() &lt; this.breakPoint){
          return this.getUTCFullYear() + "-01-01T00:00:00.000Z";
      }
      return this.original.toISOString();
  };
  
  BigDate.prototype.toJSON = function () {
      throw "not implemnted";
  };
  BigDate.prototype.toLocaleDateString = function () {
      throw "not implemnted";
  };
  BigDate.prototype.toLocaleTimeString = function () {
      throw "not implemnted";
  };
  BigDate.prototype.toLocaleString = function () {
      throw "not implemnted";
  };
  BigDate.prototype.toTimeString = function () {
      throw "not implemnted";
  };
  BigDate.prototype.toUTCString = function () {
      if(this.valueOf() &lt; this.breakPoint){
          return "01 Jan "+ this.getFullYear() +" 00:00:00 GMT";
      }
      return this.original.toUTCString();
  };
  
  
  
  
  /**
   * Don't need no timezones
   */
  
  BigDate.prototype.getDate = function () {
      return this.getUTCDate();
  };
  BigDate.prototype.getDay = function () {
      return this.getUTCDay();
  };
  BigDate.prototype.getFullYear = function () {
      return this.getUTCFullYear();
  };
  BigDate.prototype.getHours = function () {
      return this.getUTCHours();
  };
  BigDate.prototype.getMilliseconds = function() {
      return this.getUTCMilliseconds();
  };
  BigDate.prototype.getMinutes = function() { 
      return this.getUTCMinutes();
  };
  BigDate.prototype.getMonth = function () {
      return this.getUTCMonth();
  };
  BigDate.prototype.getSeconds = function () {
      return this.getUTCSeconds();
  };
  BigDate.prototype.getTimezoneOffset = function () {
      return 0;
  };
  BigDate.prototype.getTime = function () {
      return this.valueOf();
  };
  
  BigDate.prototype.setDate = function (val) {
      return this.setUTCDate(val);
  };
  BigDate.prototype.setFullYear = function (val) {
      return this.setUTCFullYear(val);
  };
  BigDate.prototype.setHours = function (val) {
      return this.setUTCHours(val);
  };
  BigDate.prototype.setMilliseconds = function (val) {
      return this.setUTCMilliseconds(val);
  };
  BigDate.prototype.setMinutes = function (val) {
      return this.setUTCMinutes(val);
  };
  BigDate.prototype.setMonth = function (val) {
      return this.setUTCMonth(val);
  };
  BigDate.prototype.setSeconds = function (val) {
      return this.setUTCSeconds(val);
  };
  
  BigDate.prototype.toString = function () {
      return this.toUTCString();
  };</code></pre>
  </div>
  </div>
  </p>