基础的 如何获得某个月的天数?不知道大家遇到过这个问题吗?我想如果你们写过日期组件一定有这个问题,我当时的解决方案是这样的: 以下的三个方法,month 参数我都根据 JS 本身对于 Date 的月份定义,采用0为1月 最老实的办法const EVERY_MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];function getDays(year, month) { if (month === 1 && isLeap(year)) return 29; return EVERY_MONTH_DAYS[month];} 手动做了每个月天数的映射,如果是2月份并闰年,那天数+1 随便安利一个自己写的 osx 上的日历插件 https://github.com/lishengzxc/ng2-calendar 那没有更好的方法呢?手动 map 和闰年判断的逻辑没有就好了。 稍微 diao 一点的办法function getDays(year, month) { if (month === 1) return new Date(year, month, 29).getMonth() === 1 ? 29 : 28; return new Date(year, month, 31).getMonth() === month ? 31 : 30;} 我们发现, new Date(2016, 0, 200) //Mon Jul 18 2016 00:00:00 GMT+0800 (CST) 这样,我们就利用这个 JS 的特性,用29和31这两个关键点,去判断除了那个月的最后一天+1还是那个月吗?(其实28和30是关键点)。 再稍微 diao 一点的方法function getDays(year, month) { return new Date(year, month + 1, 0).getDate();}
new Date(2016, 0, -200) //Sun Jun 14 2015 00:00:00 GMT+0800 (CST) Date.prototype.各种String具体的文档解释懒得再复制一下给大家看,参考链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date 这里主要和大家普及以下知识: GMT(格林尼治平时)格林尼治平时(又称格林尼治平均时间或格林尼治标准时间,旧译格林威治标准时间;英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能与实际的太阳时有误差,最大误差达16分钟。 由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治时间已经不再被作为标准时间使用。现在的标准时间,是由原子钟报时的协调世界时(UTC)。 所以我们也从 MDN 上的文档看到对于
UTC(世界标准时间)协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文「Coordinated Universal Time」/法文「Temps Universel Cordonné」而来),是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治平时 CST(北京时间)北京时间,China Standard Time,中国标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8。 不过这个CST这个缩写比较纠结的是它可以同时代表四个不同的时间:
总结就是,前后端去传时间的时候,尽量都用 UTC 时间。 ISO 日期和时间的表示方法if ( !Date.prototype.toISOString ) { ( function() { function pad(number) { if ( number < 10 ) { return '0' + number; } return number; } Date.prototype.toISOString = function() { return this.getUTCFullYear() + '-' + pad( this.getUTCMonth() + 1 ) + '-' + pad( this.getUTCDate() ) + 'T' + pad( this.getUTCHours() ) + ':' + pad( this.getUTCMinutes() ) + ':' + pad( this.getUTCSeconds() ) + '.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z'; }; }() );} 通过 Polyfill 我们就能知道 ISO 是怎么表示时间的,最主要的特征是最后一位是“Z”,然后表示的总是 UTC 时间。 额外的补充.valueOf() 和 .getTime()
该方法通常在 JavaScript 内部被调用,而不是在代码中显式调用。什么意思?没有 var obj = Object.create(null);obj + 1; // Uncaught TypeError: Cannot convert object to primitive value(…) .toJSON直接看这个 API 的名字的时候,我以为会返回一个 JSON 格式的字符串,但其实是这么一个东西 new Date().toJSON() // '2016-05-05T06:03:28.130Z' 其实是这么回事 JSON.stringify(new Date()) // ''2016-05-05T06:06:02.615Z'' 那结果能够被 parse 吗? JSON.parse(JSON.stringify(new Date())) // '2016-05-05T06:19:24.766Z'JSON.parse(''' + new Date().toJSON() + ''') // '2016-05-05T06:19:24.766Z' 但是结果只是字符串而已。需要再讲这个字符串交给 .toLocaleFormat()不属于任何标准。在JavaScript 1.6中被实现。似乎也只有 Firefox 自持这个 API,其实正确姿势是用 .toLocale各种String()
妈的这个 API 有点烦,看 MDN 的文档你就知道。这个 API 是用来本地化时间的。 这里稍微说下我对这些参数的理解:
|
|