Date相关
处理时间是常见的需求,总结下Date类的相关知识
构建时间对象
Date 对象基于1970年1月1日(世界标准时间)起的毫秒数。
构建对象实例有多种方式:
- 不传入参数,默认以系统当前时间返回一个时间对象.
new Date();
new Date();
// Wed Mar 13 2019 10:49:28 GMT+0800 (中国标准时间)
返回的是一个对象实例,控制台打印了时间字符串,是默认调用了toString()
方法。
- 传入 自1970年1月1日00:00:00 (世界标准时间) 起经过的毫秒数.
new Date(value);
new Date(1323532800000);
// Sun Dec 11 2011 00:00:00 GMT+0800 (中国标准时间)
// 可以传入负数,代表1970年1月1日00:00:00之前的时间
new Date(-10000);
// Thu Jan 01 1970 07:59:50 GMT+0800 (中国标准时间)
- 传入 表示日期的字符串.
new Date(dateString);
new Date('2011-11-11')
new Date('2011/11/11')
new Date('11/11/2011')
// Fri Nov 11 2011 00:00:00 GMT+0800 (中国标准时间)
new Date('Sun Dec 11 2011 00:00:00')
// Sun Dec 11 2011 00:00:00 GMT+0800 (中国标准时间) 注意这里是12月份了,11代表的12月
new Date('2011-11-11 11:11:11')
new Date('2011-11-11T11:11:11')
// Fri Nov 11 2011 11:11:11 GMT+0800 (中国标准时间)
new Date('aa')
// Invalid Date
只要能被[Date.parse()](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/parse)
解析的字符串,都可以作为参数传入。
- 传入 年月日等多个整数参数.
new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);
new Date(2011,11,11,11,11,11,111)
// Sun Dec 11 2011 11:11:11 GMT+0800 (中国标准时间)
new Date(2011,11)
// Thu Dec 01 2011 00:00:00 GMT+0800 (中国标准时间)
new Date(2011)
// Thu Jan 01 1970 08:00:02 GMT+0800 (中国标准时间) 只传入一个整数参数,会被当做毫秒数解析
new Date('2011',11,11)
//Sun Dec 11 2011 00:00:00 GMT+0800 (中国标准时间) 传入的参数会进行转换
new Date('2011.11',11,11)
//Sun Dec 11 2011 00:00:00 GMT+0800 (中国标准时间)
new Date('a',11,11)
// Invalid Date 无法转换成数字的参数
这种方式至少需要传入两个整数参数标志年、月,只传入一个参数会当做毫秒数进行构建;传入的参数会自动转换成数字,所以例子中传入数字字符串也是可以创建成功的。
如果把Date()
直接当作函数调用,不过有没有传入参数,都会返回当前时间的时间字符串
Date()
// "Wed Mar 13 2019 20:22:42 GMT+0800 (中国标准时间)"
Date(2011,11)
// "Wed Mar 13 2019 20:22:47 GMT+0800 (中国标准时间)"
自动折算
时间的参数都是有范围的:
- 年 使用四位数年份,比如2000。如果写成两位数或个位数,则加上1900,即10代表1910年。如果是负数,表示公元前
- 月份的范围是0~11 (0是一月份,11是12月份)
- 天数的范围是1~31
- 小时的范围是0~23
- 分钟的范围是0~59
- 秒数的范围是0~59
- 毫秒的范围是0~999
如果创建时间对象的时候,传入的参数超出了实际范围会怎样呢?
new Date(2010,12,11)
// Tue Jan 11 2011 00:00:00 GMT+0800 (中国标准时间) 月的参数12超出了范围,年份多了一年,然后月份变成了1月份(对应参数0)
new Date(2010,11,0)
// Tue Nov 30 2010 00:00:00 GMT+0800 (中国标准时间) 天的参数0不在范围内,所以月份变成了11(对应参数10),然后天变成了30
new Date(2010,11,11,25)
// Sun Dec 12 2010 01:00:00 GMT+0800 (中国标准时间) 小时的参数25超出了范围,天数变成了12,然后小时变成了1
当传入的参数超出了实际范围,会自动折算成合理的范围 , 相邻的数值也会进行调整。
利用这个特性可以做很多的事情,比如,你想获取2012年2月有共有多少天,可以这样处理。
new Date(2012,2,0).getDate()
// 29 -- 三月(对应2)没有0天,所以折算到二月(对应1)的最后一天,这时取得getDate()即是该月的天数
类型转换
如果+
或者 ==
运算符其中一个操作数是对象时,需要先把对象转化成原始值。其他的对象都会先调用valueOf()
方法,而时间对象类型会先调用toString()
1 + new Date()
// "1Thu Mar 14 2019 13:51:46 GMT+0800 (中国标准时间)"
new Date(2011,11,11).getTime() == new Date(2011,11,11)
// false 后面的Date对象,调用了toString()
new Date(2011,11,11).getTime() == +new Date(2011,11,11)
// true 此时隐式转换期待转换为数字,调用了valueOf()
其他期待转换为数字的场景,也是正常先调用valueOf()
的
时间戳
时间对象在传递过程中,一般会转换为时间戳,有多种实现方式
new Date(2011,11,11).valueOf()
// 1323532800000
new Date(2011,11,11).getTime()
// 1323532800000
+new Date(2011,11,11)
// 1323532800000
Date.now()
// 1552543813256 当前时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数
注意以上都是毫秒,如果要转成UNIX时间戳(从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数),可以用以下方法
Math.round(ms/1000)
原生方法
Date对象提供了多种方法来获取/设置时间数据
- Date对象提供了一系列get*方法,用来获取实例对象某个方面的值。
- getTime():返回实例距离1970年1月1日00:00:00的毫秒数,等同于valueOf方法。
- getDate():返回实例对象对应每个月的几号(从1开始)。
- getDay():返回星期几,星期日为0,星期一为1,以此类推。
- getFullYear():返回四位的年份。
- getMonth():返回月份(0表示1月,11表示12月)。
- getHours():返回小时(0-23)。
- getMilliseconds():返回毫秒(0-999)。
- getMinutes():返回分钟(0-59)。
- getSeconds():返回秒(0-59)。
- getTimezoneOffset():返回当前时间与 UTC 的时区差异,以分钟表示,返回结果考虑到了夏令时因素。
还提供了这些方法对应的 UTC 版本,用来返回 UTC 时间。
- getUTCDate()
- getUTCFullYear()
- getUTCMonth()
- getUTCDay()
- getUTCHours()
- getUTCMinutes()
- getUTCSeconds()
- getUTCMilliseconds()
new Date(2011,11,11,11,11,11,111).getHours()
// 11
new Date(2011,11,11,11,11,11,111).getUTCHours()
// 3 可见UTC时间比北京时间晚8个小时,也就是下面的时区差异 -480分钟
new Date(2011,11,11,11,11,11,111).getTimezoneOffset()
// -480
- Date对象提供了一系列set*方法,用来设置实例对象的各个方面。
- setDate(date):设置实例对象对应的每个月的几号(1-31),返回改变后毫秒时间戳。
- setFullYear(year [, month, date]):设置四位年份。
- setHours(hour [, min, sec, ms]):设置小时(0-23)。
- setMilliseconds():设置毫秒(0-999)。
- setMinutes(min [, sec, ms]):设置分钟(0-59)。
- setMonth(month [, date]):设置月份(0-11)。
- setSeconds(sec [, ms]):设置秒(0-59)。
- setTime(milliseconds):设置毫秒时间戳。
这些方法基本是跟get方法一一对应的,但是没有setDay方法,因为星期几是计算出来的,而不是设置的。
set系列方法除了setTime(),都有对应的 UTC 版本,即设置 UTC 时区的时间。
- setUTCDate()
- setUTCFullYear()
- setUTCHours()
- setUTCMilliseconds()
- setUTCMinutes()
- setUTCMonth()
- setUTCSeconds()
设置时间的方法,配合自动折算,可以很便捷的得到相对时间
let now = new Date();
// 99天之后的时间
now.setDate(now.getDate() + 99)
// 10小时之前
now.setHours(now.getHours() - 10)
- date对象提供一系列to* ,用来将时间对象转换为字符串
- toString() 返回一个完整的日期字符串。
- toDateString() 返回年月日的字符串
- toTimeString() 返回时间字符串,不包含年月日
也有对应的 UTC 版本 和 local版本
- toUTCString() 返回对应的 UTC 时间,也就是比北京时间晚8个小时。
- toLocaleString() 返回完整的本地时间。
let now = new Date()
undefined
now.toString()
// "Thu Mar 14 2019 14:32:18 GMT+0800 (中国标准时间)"
now.toUTCString()
// "Thu, 14 Mar 2019 06:32:18 GMT" UTC时间比北京时间晚8个小时
now.toLocaleString()
// "2019/3/14 下午2:32:18"
Date相关的更多相关文章
- 04StringBuffer相关知识、Arrays类、类型互换、正则、Date相关
04StringBuffer相关知识.Arrays类.类型互换.正则.Date相关-2018.7.12 1.StringBuffer A:StringBuffer的构造方法: public Strin ...
- Date相关类
Date相关类 SimpleDateFormat类中format()和parse()方法 parse 字符串 --> 日期 format 日期 --> 字符串 Date类中getTime( ...
- js date相关学习!
var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-???? ...
- java date相关
public static void getPreDay() throws ParseException{ String dateStr="2013-1-1"; D ...
- Available Date 相关
Available Date 写错了怎么办? http://www.cocoachina.com/bbs/read.php?tid=7224&page=1现在好像不需要改那个availa ...
- new Date()相关获取当月天数和当月第一天
var myDate = new Date(); //获取本月第一天周几 var monthFirst = new Date(myDate.getFullYear(), parseInt(myDat ...
- shell date 相关使用
#格式化输出 $> date +&q ...
- Java常用类Date相关知识
Date:类 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值.它也允许格式化和解析日期字符串. Dat ...
- java.util.Date 与 java.sql.Date 相关知识点解析
问:java.sql.Date 和 java.util.Date 有什么区别? 答:这两个类的区别是 java.sql.Date是针对 SQL 语句使用的,它只包含日期而没有时间部分,一般在读写数 ...
随机推荐
- 用c语言基本实现wc.exe功能
网址:https://github.com/3216005214/wc.exe wc项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿 ...
- NC 6.X笔记(编辑中)
1.参照多选 写在编辑前事件中 ((UIRefPane) editor.getBillCardPanel().getBodyItem("pk_wa_item").getCompon ...
- VSCode 绿色版(zip压缩包) 添加右键菜单 使用VSCode 打开文件或文件夹
微软官方下载VSCode 可以下载exe安装外还可以下载zip 压缩包 下载地址: https://code.visualstudio.com/Download 但是zip压缩包却没有了 右键使用VS ...
- python 模块——os 模块
os 模块--操作系统的各种接口 常用函数: os.path os.path.join(path,*paths) (常用,设置文件路径)将一个或者多个路径连接起来. PATH_TO_TEST_IMAG ...
- PCL安装
本文是在Ubuntu16.04下安装PCL. 按照官网的教程,有两种方法可以安装: 1.直接安装预先编译好的二进制库文件 sudo add-apt-repository ppa:v-launchpad ...
- Centos7 登录mysql 出现mysql.sock不存在
记一次纠错大战 本来今天开开心心地部署nginx和uwsgi到我的Django服务器,刚想给老师演示一遍我这项目如何酷炫时,一登陆就出现mysql连接不上了 (2003, "Can't co ...
- h3c acl配置一列
acl number 3004 rule 0 permit ip source 10.2.1.4 0 rule 1 deny ip source 192.168.1.91 0 rule 2 deny ...
- 20155205 郝博雅 Exp2 后门原理与实践
20155205 郝博雅 Exp2 后门原理与实践 一.基础问题回答 后门(木马) 专用程序 投放 隐藏(免杀) 启动(自启动.绑定) (1)例举你能想到的一个后门进入到你系统中的可能方式? 答:上学 ...
- C++: find()函数的注意事项
头文件: <algorithm> iterator find(iterator it1, iterator it2, &T);
- java面试一、1.2集合
免责声明: 本文内容多来自网络文章,转载为个人收藏,分享知识,如有侵权,请联系博主进行删除. 1.2常见集合 List.Set.Map的区别以及选用 List和Set都继承与Collectio ...