-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
说说 Javascript 的 Date #5
Comments
非常棒,特别是获取每月天数 |
不错,关于如何获取day写的很不错。但是还有点问题
|
@warjiang 是参与运算时调用的 toString?这个我觉得不对哎
日期的相减
所以这应该还是调用 valueOf 关于 .toJSON 你说的没错 |
@lishengzxc 这里我没有说清楚,我想说的是比如说执行
这个时候相当于执行
这里突出来的问题是对于 |
@warjiang 恩,其实是这样的 这个行为在 ES6 中得到充分解释,并且可以改变: 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 这个 + 或许可以这么理解
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(世界标准时间)
协调世界时,又称世界标准时间或世界协调时间,简称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()
才行。注:
.toLocaleFormat()
不属于任何标准。在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 一点的方法
一些有用的时间库
The text was updated successfully, but these errors were encountered: