Как использовать дату в Javascript для доисторических дат?

Я работаю над проектом, в котором дата JavaScript недостаточно велика.

Я хочу разместить несколько событий на одной оси времени, некоторые из них имеют месяц и день, а некоторые нет, поэтому использование года не подходит. Я хочу, чтобы посадка на Луну и большой взрыв были на одной оси.

Было бы очень полезно, если бы я мог использовать функциональность, имеющуюся у существующего объекта Date. Это всего лишь 270 000 лет назад, и мне нужно вернуться к большому взрыву (13 800 000 000 лет назад). Мне не нужно, чтобы даты содержали секунды или миллисекунды.

Как можно расширить объект Date, чтобы включить представление для таких дат?

Я пытался найти библиотеки или нативные функции для этого, но безуспешно. Я также начал искать реализацию JavaScript объекта Date, которую я мог бы изменить, но мне тоже не повезло.

Update:

Я начал с решения remdevtec, но в конце концов изменил его. Я хотел, чтобы даты приходили в числовом порядке, чтобы упростить сортировку и упорядочение дат.

Итак, я сделал так, что, если до года -100 000 год, я рассматриваю значение в миллисекундах как часы. Это то, что я получил до сих пор, и это работает в нашем проекте, но если у меня будет больше времени, я уберу его и положу на github.

JSFiddle

 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 < -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() < this.breakPoint){
       return 0;
   }
   return this.original.getUTCDate();
};
BigDate.prototype.getUTCDay = function () {
   if(this.valueOf() < this.breakPoint){
        return 0;
    }
    return this.original.getUTCDay();
};
BigDate.prototype.getUTCFullYear = function () {
    if(this.valueOf() < this.breakPoint){
        return (this.valueOf() - this.breakPoint) / this.factor;
    }
    return this.original.getUTCFullYear();
};
BigDate.prototype.getUTCHours = function () {
    if(this.valueOf() < this.breakPoint){
        return 0;
    }
    return this.original.getUTCHours();
};
BigDate.prototype.getUTCMilliseconds = function () {
    if(this.valueOf() < this.breakPoint){
        return 0;
    }
    return this.original.getUTCMilliseconds();
};
BigDate.prototype.getUTCMinutes = function () {
    if(this.valueOf() < this.breakPoint){
        return 0;
    }
    return this.original.getUTCMinutes();
};
BigDate.prototype.getUTCMonth = function () {
    if(this.valueOf() < this.breakPoint){
        return 0;
    }
    return this.original.getUTCMonth();
};
BigDate.prototype.getUTCSeconds = function () {
    if(this.valueOf() < this.breakPoint){
        return 0;
    }
    return this.original.getUTCSeconds();
};

BigDate.prototype.setUTCDate = function (val) {
    if(val >= this.yearBreakpoint){
      return this.original.setUTCDate(val);
   }
};
BigDate.prototype.setUTCFullYear = function (val) {
    if(val < 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 >= this.yearBreakpoint){
      return this.original.setUTCHours(val);
    }
};
BigDate.prototype.setUTCMilliseconds = function (val) {
    if(val >= this.yearBreakpoint){
      return this.original.setUTCMilliseconds(val);
    }
};
BigDate.prototype.setUTCMinutes = function (val) {
    if(val >= this.yearBreakpoint){
        return this.original.setUTCMinutes(val);
    }
};
BigDate.prototype.setUTCMonth = function (val) {
    if(val >= this.yearBreakpoint){
      return   this.original.setUTCMonth(val);
    }
};
BigDate.prototype.setUTCSeconds = function (val) {
    if(val >= 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() < this.breakPoint){
        return "Jan 01 " + this.getUTCFullYear();
    }
    return this.original.toDateString();
};
BigDate.prototype.toISOString = function () {
    if(this.valueOf() < 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() < 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();
};
75 голосов | спросил Ogge 20 Jpm1000000pmWed, 20 Jan 2016 12:40:04 +030016 2016, 12:40:04

3 ответа


0

Если вам нужно только представить годы, может быть достаточно простого числа: они могут содержать до +/- 9007199254740991.

Вы можете заключить его в собственный класс, чтобы обеспечить его функциями даты.

ответил Aaron 20 Jpm1000000pmWed, 20 Jan 2016 12:46:15 +030016 2016, 12:46:15
0

Свернуть дату

Создайте собственный класс, который расширяет класс Date, добавив длинное целое поле "смещение года".

Обновите все методы, которые вы хотите использовать, чтобы применить смещение этого года - вы можете оставить почти все как есть, поскольку вы не касаетесь сложностей обработки времени и дней; возможно, вам даже будет достаточно изменить конструкторы и процедуры форматирования строк, чтобы включить в них «ваш» год.

ответил Peteris 20 Jpm1000000pmWed, 20 Jan 2016 14:53:58 +030016 2016, 14:53:58
0

ECMAScript сообщает:

  

Объект Date содержит число, обозначающее определенный момент в   время с точностью до миллисекунды. Такое число называется значением времени.   значение времени также может быть NaN, указывая, что объект Date не   представляют определенный момент времени.

     

Время измеряется в ECMAScript в миллисекундах с 1 января 1970 г.   УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ. В значениях времени високосные секунды игнорируются. Предполагается, что там   ровно 86 400 000 миллисекунд в день. Числовые значения ECMAScript   может представлять все целые числа от –9,007,199,254,740,992 до   9.007.199.254.740.992; этого диапазона достаточно для измерения времени до   с точностью до миллисекунды в любой момент, который находится в пределах приблизительно   285 616 лет, вперед или назад, с 1 января 1970 года по Гринвичу.

     

Фактический диапазон времени, поддерживаемый объектами Date ECMAScript,   немного меньше: ровно –100 000 000 дней до 100 000 000 дней   измерено относительно полуночи в начале 01 января 1970 г.   УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ. Это дает диапазон 8 640 000 000 000 000 миллисекунд до   по обе стороны от 01 января 1970 года по Гринвичу.

     

Точный момент полуночи в начале 01 января 1970 года по Гринвичу   представляется значением +0.

Таким образом, вы можете создать собственный метод для дат, где вы можете использовать целочисленное значение в качестве года. Но с практической точки зрения диапазон дат Ecmascript достаточно хорош, чтобы вместить все практические даты. Тот, который вы пытаетесь достичь, не имеет реального практического смысла /значения, так как даже один не уверен, что он следует вавилонской астрологии ?

ответил Rahul Tripathi 20 Jpm1000000pmWed, 20 Jan 2016 12:48:29 +030016 2016, 12:48:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132