Open lishengzxc opened 8 years ago
非常棒,特别是获取每月天数
不错,关于如何获取day写的很不错。但是还有点问题
@warjiang 是参与运算时调用的 toString?这个我觉得不对哎
new Date().toString() // "Fri Jun 03 2016 13:41:16 GMT+0800 (CST)"
日期的相减
new Date(2017, 0, 1) - new Date() // 18267444344
所以这应该还是调用 valueOf
关于 .toJSON 你说的没错
@lishengzxc 这里我没有说清楚,我想说的是比如说执行
var d = new Date();
console.log(d + 1);
这个时候相当于执行
var d = new Date();
console.log(d.toString() + 1);
这里突出来的问题是对于 object + 1
的话
如果object
是Date
类型的话会执行object.toString() + 1
如果object
是其余的类型,会先尝试调用object.valueOf() + 1
;如果object.valueOf()
返回的还是object类型那个的话,会执行object.toString() + 1
@warjiang 恩,其实是这样的 +
运算符是会尝试调用toString()
,而其他算术运算符-
、/
、*
则是调用valueOf()
这个行为在 ES6 中得到充分解释,并且可以改变:
Symbol.toPrimitive
对象的Symbol.toPrimitive
属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。
Symbol.toPrimitive
被调用时,会接受一个字符串参数,表示当前运算的模式,一共有三种模式。
let obj = {
[Symbol.toPrimitive](hint) {
switch (hint) {
case 'number':
return 123;
case 'string':
return 'str';
case 'default':
return 'default';
default:
throw new Error();
}
}
};
2 * obj // 246
3 + obj // '3default'
obj === 'default' // true
String(obj) // 'str'
好文 赞!
👍
@warjiang @lishengzxc 这个 + 或许可以这么理解
valueOf
toString
var d = new Date()
console.log(+d)
console.log(1 + d)
console.log(1 + (+d))
toLocaleString 这个有时候返回的是英文的,有不一致的情况
很好的总结
mark, 写的很棒
干货,好文
基础的
Date()
就不说了~ :)如何获得某个月的天数?
不知道大家遇到过这个问题吗?我想如果你们写过日期组件一定有这个问题,我当时的解决方案是这样的:
以下的三个方法,month 参数我都根据 JS 本身对于 Date 的月份定义,采用0为1月
最老实的办法
手动做了每个月天数的映射,如果是2月份并闰年,那天数+1 随便安利一个自己写的 osx 上的日历插件 https://github.com/lishengzxc/ng2-calendar
那没有更好的方法呢?手动 map 和闰年判断的逻辑没有就好了。
稍微 diao 一点的办法
我们发现,
new Date()
的第三个参数是可以大于我们所知的每个月的最后一天的的,比如:这样,我们就利用这个 JS 的特性,用29和31这两个关键点,去判断除了那个月的最后一天+1还是那个月吗?(其实28和30是关键点)。
再稍微 diao 一点的方法
new Date()
的第三个参数传小于1的值会怎么样了,比如传0,我们就获得了上个月的最后一天,当然传负数也没问题: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 上的文档看到对于
toGMTString()
的解释是:协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文「Coordinated Universal Time」/法文「Temps Universel Cordonné」而来),是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治平时
CST(北京时间)
北京时间,China Standard Time,中国标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8。
不过这个CST这个缩写比较纠结的是它可以同时代表四个不同的时间:
插一个中国地区 JS 客户端时间和服务端时间不一致的问题
总结就是,前后端去传时间的时候,尽量都用 UTC 时间。
ISO 日期和时间的表示方法
通过 Polyfill 我们就能知道 ISO 是怎么表示时间的,最主要的特征是最后一位是“Z”,然后表示的总是 UTC 时间。
额外的补充
.valueOf() 和 .getTime()
.valueOf()
的功能和.getTime()
一样。该方法通常在 JavaScript 内部被调用,而不是在代码中显式调用。什么意思?没有
valueOf
,那么Date
的实例是不能进行运算的。.toJSON
直接看这个 API 的名字的时候,我以为会返回一个 JSON 格式的字符串,但其实是这么一个东西
其实是这么回事
那结果能够被 parse 吗?
但是结果只是字符串而已。需要再讲这个字符串交给
new Date()
才行。注:
不属于任何标准。在JavaScript 1.6中被实现。似乎也只有 Firefox 自持这个 API,其实正确姿势是用
.toLocaleDateString()
.toLocale各种String()
.toLcale各种String(locales [, options]])
妈的这个 API 有点烦,看 MDN 的文档你就知道。这个 API 是用来本地化时间的。
这里稍微说下我对这些参数的理解:
locales
以
locales
所指的地区的时区和语言输出。options
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString
localeMatcher
选择本地匹配的什么算法,似乎没什么大用timeZone
再设置下 UTC 时区hour12
是否12小时制formatMatcher
各日期时间单元的格式化weekday
Possible values are"narrow", "short", "long"
.era
Possible values are"narrow", "short", "long"
.year
Possible values are"numeric", "2-digit"
.month
Possible values are"numeric", "2-digit", "narrow", "short", "long"
.day
Possible values are"numeric", "2-digit"
.hour
Possible values are"numeric", "2-digit"
.minute
Possible values are"numeric", "2-digit"
.second
Possible values are"numeric", "2-digit"
.timeZoneName
Possible values are"short", "long"
.栗子:
插一个JavaScript 显示 Y-m-d H:i:s 的日期时间格式
老实的方法
diao 一点的方法
一些有用的时间库