Date 是 JS 中的重要的一个内置对象,其实例主要用于处理时间和日期,其时间基于 1970-1-1 (世界标准时间)起的毫秒数,时间戳长度为 13 位(不一样于 Unix 时间戳的长度 10 位)。对于日期和时间,咱们有无数个使用场景,所以须要特别注意一些细节和约定。html
经过 new Date() 能够进行实例化,获得一个 Date 对象实例,值得注意的是若是直接执行 Date()
,将获得一个时间字符串。mysql
new Date(); new Date(value); new Date(dateString); new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);
<!-- more -->git
其中对构造函数的参数说明(参考 MDN ):github
// 以chrome为例 new Date(); // Mon Oct 23 2017 23:38:02 GMT+0800 (CST) new Date(false); // Thu Jan 01 1970 08:00:00 GMT+0800 (CST) new Date(0); // Thu Jan 01 1970 08:00:00 GMT+0800 (CST) new Date(null); // Thu Jan 01 1970 08:00:00 GMT+0800 (CST) new Date(''); // Invalid Date new Date(undefined); // Invalid Date
[Firefox]sql
不支持带 '-' 的完整时间,好比 new Date('2012-07-08 00:00:00') 为无效的值,而 new Date('2012-07-08') 是正确的值。chrome
[month]数据库
不一样执行环境下的边界值有差别, Chrome 下甚至连负值都能支持。在实际生产环境中,不只须要考虑时间的展现,还须要考虑其存储、计算等,所以在特定的场景下,咱们须要尽量考虑到数据库和浏览器中 Date 的有效范围。编程
以数据库 Derby
存储时间为例,其边界为:浏览器
说明 | 边界值 |
---|---|
最小的日期 | 0001-01-01 |
最大的日期 | 9999-12-31 |
最小的时间 | 00:00:00 |
最大的时间 | 24:00:00 |
最小的时间戳 | 0001-01-01-00.00.00.000000 |
最大的时间戳 | 9999-12-31-23.59.59.999999 |
在 mysql
中,其范围定义为 1000-01-01
to9999-12-31
;
在 js
中,时间戳的最小值为 -8640000000000000
即公元前 271,821 年 4 月 20 日,最大值为 8640000000000000
,即 275,760 年 9 月 13 日。规范中时间范围为 1970/1/1 先后 100,000,000
天。编程语言
据说,2038 年以后时间戳不够用了。
在计算机应用上,2038年问题可能会致使某些软件在2038年没法正常工做。全部使用UNIX时间表示时间的程序都将受其影响,由于它们以自1970年1月1日通过的秒数(忽略闰秒)来表示时间。这种时间表示法在类Unix(Unix-like)操做系统上是一个标准,并会影响以其C编程语言开发给其余大部份操做系统使用的软件。在大部份的32位操做系统上,此“time_t”数据模式使用一个有正负号的32位元整数(signedint32)存储计算的秒数。依照此“time_t”标准,在此格式能被表示的最后时间是2038年1月19日03:14:07,星期二(UTC)。超过此一瞬间,时间将会被掩盖(wrap around)且在内部被表示为一个负数,并形成程序没法工做,由于它们没法将此时间识别为2038年,而可能会依个别实做而跳回1970年或1901年。错误的计算及动做可能所以产生。
实际上参考第 4 部分,Date 的上限绰绰有余,你们能够拿起手头的设备测试一下 2038 年会出现怎样的异状。
一、EmacScript 语言规范 - http://ecma-international.org/ecma-262/5.1/#sec-15.9
二、Mysql 时间范围 - https://dev.mysql.com/doc/refman/5.5/en/datetime.html
三、JS 时间戳边界 - https://stackoverflow.com/questions/11526504/minimum-and-maximum-date