1、Date对象
(1) getTime和valueOf的返回值是一样的
getTime() | 返回 1970 年 1 月 1 日至今的毫秒数。 |
valueOf() | 返回 Date 对象的原始值 |
(2)不是很重要一般都用第(5)
toxxx 使用本地时间表示
toUTC 世界时
toLocale 以本地时间区表示,并根据本地规则格式化
toTimeString() | 把 Date 对象的时间部分转换为字符串。 |
toDateString() | 把 Date 对象的日期部分转换为字符串。 |
toString() | 把 Date 对象转换为字符串。 |
toJSON() | 以 JSON 数据格式返回日期字符串。 |
parse() | 返回1970年1月1日午夜到指定日期(字符串)的毫秒数。 |
Date.parse()
方法解析一个表示某个日期的字符串,并返回从1970-1-1 00:00:00 UTC 到该日期对象(该日期对象的UTC时间)的毫秒数,如果该字符串无法识别,或者一些情况下,包含了不合法的日期数值(如:2015-02-31),则返回值为NaN。
(3)得到和设置各个时间
设置日期
通过使用针对日期对象的方法,我们可以很容易地对日期进行操作。
在下面的例子中,我们为日期对象设置了一个特定的日期 (2010 年 1 月 14 日):
var myDate=new Date(); myDate.setFullYear(2010,0,14);
在下面的例子中,我们将日期对象设置为 5 天后的日期:
var myDate=new Date(); myDate.setDate(myDate.getDate()+5);
注意: 如果增加天数会改变月份或者年份,那么日期对象会自动完成这种转换。
两个日期比较
日期对象也可用于比较两个日期。
下面的代码将当前日期与 2100 年 1 月 14 日做了比较:
var x=new Date(); x.setFullYear(2100,0,14); var today = new Date(); if (x>today) { alert("今天是2100年1月14日之前"); } else { alert("今天是2100年1月14日之后"); }
(4) 创建
有四种方式初始化日期:
new Date(); new Date(value); new Date(dateString); new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);
上面的参数大多数都是可选的,在不指定的情况下,默认参数是0。
实例化一个日期的一些例子:
var today = new Date() var d1 = new Date("October 13, 1975 11:13:00") var d2 = new Date(79,5,24) var d3 = new Date(79,5,24,11,33,0)
(5) 一般用的多的是
var myDate = new Date();
new Date(myDate.toLocaleDateString().replace(/-/g, "/"))
来创建一个当前0点日期
(6)new Date('2019-12-22')得到的时间是8点
用dateStr.replace(/-/g, '/');或者直接new Date('2019/12/22')就是0点了
链接: js new Date 创建时间默认是8点 - 烟草的香味 - 博客园
起因
最近在写一个页面,需要用到时间控制。然后我通过new Date()
传入日期字符串创建了一个对象,并与当前时间做时间戳比较,结果12点刚过,就出问题了。举个栗子
// 假设当前时间是2019年12月22日0点20分 new Date('2019-12-22').getTime() < new Date().getTime() // 上面的结果是什么?正常来说应该是true吧,但不好意思啊,返回了false
百思不得其解,当时因为情况紧急,查出了上面的创建时间返回的内容并不是0点,而是8点
所以就强行在时间字符串上拼接了时间:new Date('2019-12-22 00:00:00').getTime()
, 强行解决了这个问题。
然后又碰到了在IOS上不识别中横线分割的时间字符串问题,讲中横线转成了反斜杠。
当时临时解决问题后的字符串大概长这样:
new Date('2019/12/22 00:00:00').getTime() < new Date().getTime()
临时解决问题。现在闲来无事,可以看看这个问题究竟是什么鬼?
尝试
传入不同的字符串格式,看看结果,我只尝试了最常使用的两种格式
惊讶的发现,-
分割的字符串,被默认解析到了8点,而/
分割的字符串,默认解析到了0点。这么说来,我之前有点多次一举了,直接讲-
替换成/
就可以了啊。
探究
那么为什么默认是8点呢?有没有觉得8这个数字很值得关注,我们所在的时区是东八区,如果以GMT标准0点来算的话,在那个时间点,这里就是8点啊。
那我就可以这样理解了,创建时间时,它默认时间确实是0点,但是是以GMT为基准的,所以将其转换成本地时间就是8点。而/
分割的字符串在创建时,则是以本地时区为基准。
那么为什么js会对不同分割的时间字符串进行不同处理呢?貌似是因为-
分隔且具有前导0的日期字符串,会被解析成ISO格式的字符串,以GMT时区为基准,不过我也没看懂。
解决
最终,既然-
分割的字符串会出问题,那我就讲所有的-
都换成/
就好了,正好也可以借此解决IOS的兼容问题。
动手解决:
/** * 将时间字符串转换成date对象 * @param dateStr * 时间字符串 */ function getDate(dateStr){ /* 若日期是使用-分割的,全部转换成/ 因为只有日期时,js会将-分割的字符串基准时区设置为GMT,与当前时区相差8小时 */ dateStr = dateStr.replace(/-/g, '/'); return new Date(dateStr); }
(7)Date怎么比较大小的