如何在Javascript中使用日期作为史前日期?

奥格

我正在研究JavaScript Date不够大的项目。

我想在同一时间轴上放置多个事件,其中一些事件有月和日,而有些则没有,所以仅使用年份是不可行的。我希望能够使月亮落在同一轴上并发生大爆炸。

如果我可以使用现有Date对象所具有的功能,那将有很大帮助。它只能追溯到270,000年,而我需要一直回到大爆炸(138亿年前)。我不需要日期包含秒或毫秒。

如何扩展Date对象以包括此类日期的表示形式?

我试图为此找到库或本机函数,但是没有运气。我也开始寻找可以修改Date对象的JavaScript实现,但是我在这里也没有运气。

更新:

我从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();
};

Remdevtec

我不需要日期包含秒或毫秒。

请注意,公历以400年为周期移动,因此以240,000年为周期移动。因此,您可以将Date不想使用的60000毫秒表示形式返回到240000年的循环中(最多60000个这样的循环)。这可以将您带到大约144亿年的BC(仅在Big Bang之前),并且具有分钟的分辨率。

下面的示例未考虑Date对象的所有功能。但是,通过进一步的实施,我相信可能具有类似的功能。举例来说,一个BigDate,x是比另一个BigDate更大,y如果这两个日期ACx.original > y.original或者x.isAC()不过!y.isAC(),或者如果这两个日期是BC这样的,要么x.getFullYear() < y.getFullYear()x.getFullYear() === y.getFullYear() && x.original > y.original

BigDate用法:

var time = new Date (
  [year /*range: 0-239999*/], 
  [month /*range: 0-11*/], 
  [day of month /*range: 1-31*/], 
  [hours /*range: 0-23*/], 
  [minutes /*range: 0-59*/], 
  [a factor of 240,000,000 years to go back (from the first parameter year) /*range: 0-59*/],
  [a factor of 240,000 years to go back (from the first parameter year) /*range: 0-999*/]); 
var bigDate = new BigDate(time);

的HTML

<span id="years"></span>
<span id="months"></span>
<span id="date"></span>
<span id="hours"></span>
<span id="minutes"></span>
<span id="acbc"></span>

JAVASCRIPT

function BigDate (date) { this.original = date; }    

// set unchanged methods,
BigDate.prototype.getMinutes = function () { return this.original.getMinutes(); }
BigDate.prototype.getHours = function () { return this.original.getHours(); }
BigDate.prototype.getDate = function () { return this.original.getDate(); }
BigDate.prototype.getMonth = function () { return this.original.getMonth(); }

// implement other BigDate methods..

肉来了:

// now return non-negative year
BigDate.prototype.getFullYear = function () {  
  var ms = this.original.getSeconds() * 1000 + this.original.getMilliseconds();
  if (ms === 0) return this.original.getFullYear();
  else return (ms * 240000) - this.original.getFullYear();
}

// now add AC/BC method
BigDate.prototype.isAC = function () {
  var result = this.original.getSeconds() === 0 &&
    this.original.getMilliseconds() === 0;
  return result;
}

一些演示(也可以用于制作BigDate.prototype.toString()等):

var years = document.getElementById("years");
var months = document.getElementById("months");
var date = document.getElementById("date");
var hours = document.getElementById("hours");
var minutes = document.getElementById("minutes");
var acbc = document.getElementById("acbc");

// SET A TIME AND PRESENT IT
var time = new Date (2016, 1, 28, 8, 21, 20, 200); 
var bigDate = new BigDate(time);
var monthsName = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
years.innerHTML = bigDate.getFullYear();
months.innerHTML = monthsName[bigDate.getMonth()];    
date.innerHTML = bigDate.getDate();
hours.innerHTML = bigDate.getHours() + ":";
minutes.innerHTML = bigDate.getMinutes();
acbc.innerHTML = (bigDate.isAC()) ? "AC":"BC";

结果内容将是: 4847996014 Jan 28 8: 21 BC

这是一个JSFiddle

澄清度

关于(合理的)设计评论,我知道BigDate上面介绍对象表现出较差的界面和设计。提出该对象仅作为使用秒和毫秒的未使用信息来满足该问题的示例我希望该示例有助于理解该技术。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Twig中使用JavaScript输出当前日期

来自分类常见问题

如何在标签中使用python当前日期显示

来自分类Dev

如何在标签中使用python当前日期显示

来自分类Dev

如何在php中使用当前日期时间代码

来自分类Dev

如何在OpenERP中使用Yaml定义当前日期?

来自分类Dev

如何在 Swift 中使用当前日期更新标签?

来自分类Dev

如何在sqlite中使用当前日期时间更新现有表的日期时间列

来自分类Dev

如何在Laravel中使用whereBetween作为日期

来自分类Dev

如何在Python中使用Lambda作为日期时间参数

来自分类Dev

如何在 matplotlib 中使用 5 列作为日期?

来自分类Dev

如何使用当前日期作为CSV文件的名称

来自分类Dev

如何在C#中使用Linq获取当前日期模块名称?

来自分类Dev

如何在HTML中使用占位符在文本框中显示当前日期

来自分类Dev

如何在续集中使用数据库时区获取当前日期/时间

来自分类Dev

如何在JavaScript中延长当前日期?

来自分类Dev

如何在 JavaScript 和 HTML 中获取当前日期?

来自分类Dev

如何在Javascript中使用星期几的名称获取日期?

来自分类Dev

如何在JavaScript中查找日期是否在当前日期之前

来自分类Dev

如何在Python中使用诸如“ 1小时5秒”之类的字符串添加当前日期

来自分类Dev

如何在 Python 中使用 datetime 从当前日期获取过去 90 天(3 个月)的星期日

来自分类Dev

在Powershell中使用当前日期作为名称创建文件夹

来自分类Dev

如何在Google表格的单元格中显示默认的当前日期,在该单元格中使用数据验证来选择日期?

来自分类Dev

使用JavaScript获取当前日期/时间

来自分类Dev

如何在Julia中使用日期时间?

来自分类Dev

如何在PostgreSQL中使用日期格式?

来自分类Dev

如何在Expect脚本中使用日期?

来自分类Dev

如何在PostgreSQL中使用日期格式?

来自分类Dev

如何在Django中使用日期时间过滤日期时间?

来自分类Dev

如何使用javascript显示/打印当前日期和下一个日期

Related 相关文章

  1. 1

    如何在Twig中使用JavaScript输出当前日期

  2. 2

    如何在标签中使用python当前日期显示

  3. 3

    如何在标签中使用python当前日期显示

  4. 4

    如何在php中使用当前日期时间代码

  5. 5

    如何在OpenERP中使用Yaml定义当前日期?

  6. 6

    如何在 Swift 中使用当前日期更新标签?

  7. 7

    如何在sqlite中使用当前日期时间更新现有表的日期时间列

  8. 8

    如何在Laravel中使用whereBetween作为日期

  9. 9

    如何在Python中使用Lambda作为日期时间参数

  10. 10

    如何在 matplotlib 中使用 5 列作为日期?

  11. 11

    如何使用当前日期作为CSV文件的名称

  12. 12

    如何在C#中使用Linq获取当前日期模块名称?

  13. 13

    如何在HTML中使用占位符在文本框中显示当前日期

  14. 14

    如何在续集中使用数据库时区获取当前日期/时间

  15. 15

    如何在JavaScript中延长当前日期?

  16. 16

    如何在 JavaScript 和 HTML 中获取当前日期?

  17. 17

    如何在Javascript中使用星期几的名称获取日期?

  18. 18

    如何在JavaScript中查找日期是否在当前日期之前

  19. 19

    如何在Python中使用诸如“ 1小时5秒”之类的字符串添加当前日期

  20. 20

    如何在 Python 中使用 datetime 从当前日期获取过去 90 天(3 个月)的星期日

  21. 21

    在Powershell中使用当前日期作为名称创建文件夹

  22. 22

    如何在Google表格的单元格中显示默认的当前日期,在该单元格中使用数据验证来选择日期?

  23. 23

    使用JavaScript获取当前日期/时间

  24. 24

    如何在Julia中使用日期时间?

  25. 25

    如何在PostgreSQL中使用日期格式?

  26. 26

    如何在Expect脚本中使用日期?

  27. 27

    如何在PostgreSQL中使用日期格式?

  28. 28

    如何在Django中使用日期时间过滤日期时间?

  29. 29

    如何使用javascript显示/打印当前日期和下一个日期

热门标签

归档