整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

常用正则表达式最强整理(速查手册)

常用正则表达式最强整理(速查手册)

、校验数字的表达式

  1. 数字:^[0-9]*$
  2. n位的数字:^\d{n}$
  3. 至少n位的数字:^\d{n,}$
  4. m-n位的数字:^\d{m,n}$
  5. 零和非零开头的数字:^(0|[1-9][0-9]*)$
  6. 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
  7. 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
  8. 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
  9. 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
  10. 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
  11. 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
  12. 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
  13. 非负整数:^\d+$ 或 ^[1-9]\d*|0$
  14. 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
  15. 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
  16. 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
  17. 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
  18. 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
  19. 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

二、校验字符的表达式

  1. 汉字:^[\u4e00-\u9fa5]{0,}$
  2. 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
  3. 长度为3-20的所有字符:^.{3,20}$
  4. 由26个英文字母组成的字符串:^[A-Za-z]+$
  5. 由26个大写英文字母组成的字符串:^[A-Z]+$
  6. 由26个小写英文字母组成的字符串:^[a-z]+$
  7. 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
  8. 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}
  9. 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
  10. 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
  11. 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
  12. 禁止输入含有~的字符[^~\x22]+

其它:

.*匹配除 \n 以外的任何字符。

/[\u4E00-\u9FA5]/ 汉字

/[\uFF00-\uFFFF]/ 全角符号

/[\u0000-\u00FF]/ 半角符号

三、特殊需求表达式

  1. Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  2. 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  3. InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
  4. 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
  5. 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
  6. 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
  7. 身份证号(15位、18位数字):^\d{15}|\d{18}$
  8. 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
  9. 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  10. 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
  11. 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
  12. 日期格式:^\d{4}-\d{1,2}-\d{1,2}
  13. 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
  14. 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$

钱的输入格式:

1.有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$

2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$

3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$

4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$

5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$

6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$

7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$

8.1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$

备注:这就是最终结果了,别忘了+可以用*替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里

  1. xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$
  2. 中文字符的正则表达式:[\u4e00-\u9fa5]
  3. 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
  4. 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
  5. HTML标记的正则表达式:<(\S*?)[^>]*>.*?</>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
  6. 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
  7. 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
  8. 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
  9. IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
  10. IP地址:((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))
  11. IP-v4地址:\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b (提取IP地址时有用)
  12. 校验IP-v6地址:(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))
  13. 子网掩码:((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))
  14. 校验日期:^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$(“yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。)
  15. 抽取注释:<!--(.*?)-->
  16. 查找CSS属性:^\s*[a-zA-Z\-]+\s*[:]{1}\s[a-zA-Z0-9\s.#]+[;]{1}
  17. 提取页面超链接:(<a\s*(?!.*\brel=)[^>]*)(href="https?:\/\/)((?!(?:(?:www\.)?'.implode('|(?:www\.)?', $follow_list).'))[^" rel="external nofollow" ]+)"((?!.*\brel=)[^>]*)(?:[^>]*)>
  18. 提取网页图片:\< *[img][^\\>]*[src] *=*[\"\']{0,1}([^\"\'\ >]*)
  19. 提取网页颜色代码:^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$
  20. 文件扩展名效验:^([a-zA-Z]\:|\\)\\([^\\]+\\)*[^\/:*?"<>|]+\.txt(l)?$
  21. 判断IE版本:^.*MSIE [5-8](?:\.[0-9]+)?(?!.*Trident\/[5-9]\.0).*$

附表:

别人过闰月生日,你也期待过吗?我期待过。

假设还有120多岁寿命(活到2142年),从今年开始,还有一共46个农历闰年。

你是农历几月生,看下表可知“双生日年份”:

由上表可知农历十二月、一月、十月的人没有一年两次过生日的机会,而闰十一月(又被称为闰冬月)机会也很少。不是谁都有过闰月生日的机会。

注意

从120年看,似乎闰十月很少,闰一月也没有。实际上在更大的时间范围内,正真稀少的是闰十二月

公元1645-公元2796年闰月分布频数图,851年里面一个闰十二月都没有。

闰月分布根源

闰月来源:把二十四节气分为节气和中气,每个中气必须落在指定的月份,如果月份过去了中气还没到,那么就要闰一个月来保证这个中气落在这个月份里。

自然界很多现象都呈正态分布,闰月分布频数图也是。但是,闰月呈现出四五六七月份多,十一、十二、一月少(夏多冬少)的状况是因为地球绕太阳公转------远日点离太阳远,公转慢,时间长,两个中气的间隔大,所以在这段时期及其前后的历月中,不包含中气的机会就多,这就是闰四、五、六月次数最多的原因。近日点相反,所以置闰的机会自然就会少一些。


参考资料:

https://www.rili.com.cn/nonglizhishi/1720.html

https://zhidao.baidu.com/question/1709035843620833500.html

https://www.zhihu.com/question/22485145

内容是《Web前端开发之Javascript视频》的课件,请配合大师哥《Javascript》视频课程学习。

Date日期对象:用于处理日期和时间。

基本概念:

GMT:(Greenwich Mean Time)格林尼治标准时(格林威治),这个时间系统的概念在 1884 年确立,由英国伦敦的格林威治皇家天文台(即本初子午线的位置)计算并维护。

UTC:(Universal Time Code 通用时间),也叫格林尼治标准时间,(也称为:协调世界时、世界统一时间、世界标准时间、国际协调时间)。

时区:由于各国家与地区经度不同,地方时也有所不同; 1884年在华盛顿召开的一次国际经度会议,把全球划分为不同的时区,每隔经度15°划分一个时区,其被划分为24个时区,分为东12区和西12区。

夏令时:(Summer time),又称日光节约时、日光节约时间,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。

计算机元年(纪年):1970年1月1日0时0分0秒作为计算机元年,用于计时的开始。

时间戳:是一个自增的整数,它表示从1970年1月1日零时整的GMT时区开始的那一刻,到现在的毫秒数,时间戳可以精确地表示一个时刻,并且与时区无关。

Date使用的是UTC;是所有时区的基准标准时间,是1970年1月1日凌晨0点0分0秒开始经过的毫秒数保存日期;

在使用这种数据存储格式的条件下,Date()类型保存的日期能够精确到70年1月1日之前或之后的100 000 000天。

Date对象创建

使用Date()构造函数,语法:var now=Date();

var d = new Date();  //以当前日期和时间创建Date对象
var d = new Date(0);  //以距离1970.1.1:00:00:00的毫秒数创建Date对象
var d = new Date(2020,7,18);
console.log(d);

new Date()的参数很多种形式,每种都表示不同的含义;

如果传值为 0,会得到一个表示 1970年1月1日的Date 对象;

或者使用Date()函数,但本质上不一样,输出也不一样,实质上是一个转换函数;

说明:因为要传入是表示该日期的毫秒数(即从UTC时间70年1月1日前夜起到该日期止的毫秒数)。为了简化这一计算过程,ECMAScript提供了两个静态方法:Date.parse()和Date.UTC();

Date.parse()方法接受一个表示日期的字符串参数,返回一个时间戳(毫秒数);

日期字符串应该符合 RFC 2822 和 ISO 8061 这两个标准,ISO 8601扩展格式 YYYY-MM-DDTHH:mm:ss:ssssZ,如:2020-05-25T00:00:00;(yyyy4位年份、MM月份、DD天、HH时、mm分、ss秒、ssss毫秒)

通常见的日期格式:

mm/dd/yyyy 如: 3/21/2009,即月/日/年

yyyy/mm/dd 如: 2009/3/21

mmmm dd,yyyy 如: Apr 21,2009,即英文月名 日,年,即January 12,2010

英文星期几 月 日 年 时:分:秒 时区,如:Tue May 25 2020 00:00:00 GMT-0700

var d = Date.parse("May 25,2020");
Date.parse('2018-07-22')
Date.parse('2018-07')
Date.parse('2018')
Date.parse('07/22/2018')
Date.parse('2018/07/22')
Date.parse('2018/7/22')
Date.parse('July 22, 2018')
Date.parse('July 22, 2018 07:22:13')
Date.parse('2018-07-22 07:22:13')
Date.parse('2018-07-22T07:22:13')

注:如果传入Date.parse()方法的字符串不能表示日期,那么它会返回NaN;

根据parse()返回值创建Date对象;

var d = new Date(Date.parse("May 25, 2020"));

实际上,如果直接将表示日期的字符串传递给Date构造函数,也会在后台调用Date.parse(),两者是等价的,如:

var d = new Date("May 25, 2020");

注:日期对象在不同浏览器实现的并不统一,比如,传入了超出范围的值:

var d = new Date("January 33,2020");

在解析January 33,2020,有些浏览器返回:Invalid Date;IE返回:Sun Feb 02 2020(把超出的时间往后自动推算);

可以在月份或者日期字段添加或省略前导零;

console.log(new Date('2020-6-6'));
console.log(new Date('2020-06-06'));
console.log(new Date('2020-06-06 09:18:15'));
console.log(new Date('2020-06-06T09:18:15'));
console.log(new Date('2020-06'));
console.log(new Date('2020'));
console.log(new Date('06/07/2020'));
console.log(new Date('2020/06/07'));
console.log(new Date('2020/6/7'));
console.log(new Date('2020.6.7'));
console.log(new Date('2020.6.7 15:18:15'));
console.log(new Date('July 18, 2020'));
console.log(new Date('July 18, 2020 09:30:28'));
console.log(new Date('18 July 2020'));
console.log(new Date('18 July, 2020'));
console.log(new Date('18 July 2020 09:30:28'));
console.log(new Date('July 2020'));

其实Date在内部是使用时间戳实现的;

var d = new Date(1591866649132)
console.log(d);

UNIX 时间戳的原因以秒(seconds)为单位。JavaScript 以毫秒(milliseconds)为单位记录时间。

可在使用UNIX 时间戳去实例化Date 对象;

var timestamp = 1591866649;
var d = new Date(timestamp * 1000);
console.log(d);

Date.UTC()方法:

返回表示日期的毫秒数,但它与Date.parse()在构建值时使用不同的信息,即与当前所在的时区相关,生成的日期都相对于计算机的时区;

语法:Date.UTC(year, month[, date[, hrs[, min[, sec[, ms]]]]]);

其参数为日期中的年,月(基于0),日,小时(0到23),分,秒,毫秒,其中年月必选;如果没有提供日,默认为1,如果省略其他参数,则统统默认为0;

至少应该是3个参数,但是大多数 JavaScript 引擎都能解析 2 个或 1 个参数;

var d = Date.UTC(2020);
var d = Date.UTC(2020,6);  // 毫秒数1593561600000
var d=new Date(Date.UTC(2020,6)); 
var d = new Date(Date.UTC(2020,6,6,17,55,55)); // 自动添加时区,返回当地日期和时间
var d=new Date(2020,6,10); //月份从0开始,6即是7月
console.log(d);

如果没有任何关于时区的信息,会将日期视为 UTC ,并自动执行到当前计算机时区的转换;

可以直接把UTC参数传递给Date()构造函数,如:

var d=new Date(2020,6); // Wed Jul 01 2020 00:00:00 GMT+0800 
var d = new Date(2020,6,6,17,55,55); // 即为GMT时间
console.log(d);

时区:

当初始化一个 Date 对象时可以选择时区,可以通过添加 +HOURS 的格式,或者通过一个被圆括号包裹的时区名来描述一个时区:

console.log(new Date());
console.log(new Date('Jun 7,2020 13:51:01 +0700'));
console.log(new Date('Jun 7,2020 13:51:01 (CET)'));   // CET欧洲中部时间

如果你使用时区名的方式但在圆括号中定义了一个错误的时区名,JavaScript 将会静默地将时区设置为默认的 UTC。

如果你使用 +HOURS 的方式但传入的数字格式是错误的,JavaScript 将会抛出一个 “Invalid Date” 的 Error。

继承的方法:

与其他引用类型一样,Date类型也重写了toLocaleString()、toString()和valueOf()方法;但这些方法的返回值与其他类型中的方法不同。

valueOf()方法:返回日期的毫秒数;

toString()方法:通常返回带有时区信息的日期和时间;其中时间一般以军用时间(即小时从0到23);

toLocaleString():会按照与浏览器设置的地区相适应的格式返回日期和时间;即时间格式中会包含AM或PM,但不会包含时区信息;

var d=new Date(2020,6); // Wed Jul 01 2020 00:00:00 GMT+0800 
var d = new Date(2020,6,6,17,55,55); // 即为GMT时间
console.log(d);

注:真实场景中,toString()和toLocaleString()没有什么用,仅在调试代码时使用;

至于valueOf()方法,返回的是毫秒数,因此,可以方便的使用比较操作来比较日期,如:

console.log(new Date());
console.log(new Date('Jun 7,2020 13:51:01 +0700'));
console.log(new Date('Jun 7,2020 13:51:01 (CET)'));   // CET欧洲中部时间

注意日期比较的惯性思维,如2019.1.1早于2020.2.1日,但后者返回的毫秒数大。

Date对象方法:

  • Date():返回当日的日期和时间。
  • getDate():从 Date 对象返回一个月中的某一天 (1 ~ 31)。
  • getDay():从 Date 对象返回一周中的某一天 (0 ~ 6)。
  • getMonth():从 Date 对象返回月份 (0 ~ 11)。
  • getFullYear():从 Date 对象以四位数字返回年份。
  • getYear():请使用 getFullYear() 方法代替。
  • getHours():返回 Date 对象的小时 (0 ~ 23)。
  • getMinutes():返回 Date 对象的分钟 (0 ~ 59)。
  • getSeconds():返回 Date 对象的秒数 (0 ~ 59)。
  • getMilliseconds():返回 Date 对象的毫秒(0 ~ 999)。
  • getTime():返回 1970 年 1 月 1 日至今的毫秒数,与valueOf()返回值相同。
  • getTimezoneOffset():返回本地时间与格林威治标准时间 (GMT) 的分钟差。
  • getUTCDate():根据世界时从 Date 对象返回月中的一天 (1 ~ 31)。
  • getUTCDay():根据世界时从 Date 对象返回周中的一天 (0 ~ 6)。
  • getUTCMonth():根据世界时从 Date 对象返回月份 (0 ~ 11)。
  • getUTCFullYear():根据世界时从 Date 对象返回四位数的年份。
  • getUTCHours():根据世界时返回 Date 对象的小时 (0 ~ 23)。
  • getUTCMinutes():根据世界时返回 Date 对象的分钟 (0 ~ 59)。
  • getUTCSeconds():根据世界时返回 Date 对象的秒钟 (0 ~ 59)。
  • getUTCMilliseconds():根据世界时返回 Date 对象的毫秒(0 ~ 999)。
  • parse():返回1970年1月1日午夜到指定日期(字符串)的毫秒数。
  • setDate():设置 Date 对象中月的某一天 (1 ~ 31)。
  • setMonth():设置 Date 对象中月份 (0 ~ 11)。
  • setFullYear():设置 Date 对象中的年份(四位数字)。
  • setYear():请使用 setFullYear() 方法代替。
  • setHours():设置 Date 对象中的小时 (0 ~ 23)。
  • setMinutes():设置 Date 对象中的分钟 (0 ~ 59)。
  • setSeconds():设置 Date 对象中的秒钟 (0 ~ 59)。
  • setMilliseconds():设置 Date 对象中的毫秒 (0 ~ 999)。
  • setTime():以毫秒设置 Date 对象。
  • setUTCDate():根据世界时设置 Date 对象中月份的一天 (1 ~ 31)。
  • setUTCMonth():根据世界时设置 Date 对象中的月份 (0 ~ 11)。
  • setUTCFullYear():根据世界时设置 Date 对象中的年份(四位数字)。
  • setUTCHours():根据世界时设置 Date 对象中的小时 (0 ~ 23)。
  • setUTCMinutes():根据世界时设置 Date 对象中的分钟 (0 ~ 59)。
  • setUTCSeconds():根据世界时设置 Date 对象中的秒钟 (0 ~ 59)。
  • setUTCMilliseconds():根据世界时设置 Date 对象中的毫秒 (0 ~ 999)。
  • toSource():返回该对象的源代码。
  • toString():把 Date 对象转换为字符串。
  • toTimeString():把 Date 对象的时间部分转换为字符串。
  • toDateString():把 Date 对象的日期部分转换为字符串。
  • toGMTString():请使用 toUTCString() 方法代替。
  • toUTCString():根据世界时,把 Date 对象转换为字符串。
  • toLocaleString():根据本地时间格式,把 Date 对象转换为字符串。
  • toLocaleTimeString():根据本地时间格式,把 Date 对象的时间部分转换为字符串。
  • toLocaleDateString():根据本地时间格式,把 Date 对象的日期部分转换为字符串。
  • toISOString():返回对应的UTC时间的 ISO8601 写法,如2012-12-31T16:00:00.000Z,
  • toJSON():返回值同toISOString()
  • UTC():根据世界时返回 1970 年 1 月 1 日 到指定日期的毫秒数。
  • valueOf():返回 Date 对象的原始值。

以上方法大概分为三种:to方法、get方法和set方法。

to方法-日期格式化方法:

date()类型还有一些专门用于将日期格式化为字符串的方法,如:

  • toString():
  • toDateString():以特定于实现的格式显示星期几、月、日和年;
  • toTimeString():以特定于实现的格式显示时、分、秒和时区;
  • toLocaleDateString():以特定于地区的格式显示星期几、月、日和年;
  • toLocaleTimeString():在特定于地区的格式显示 时、分、秒;
  • toUTCString():以特定于实现的格式显示UTC日期;
  • toISOString():返回ISO表示的日期;
  • toGMTString()方法,这是一个与toUTCString()等价的方法,其存在的目的在于确保向后兼容;不过ECMAScript推荐使用toUTCString()方法;

getter方法:

用于获取当前日期时间信息;

var d = new Date();
console.log(d.getDate()); //18
console.log(d.getDay());  //4
console.log(d.getFullYear()); //2020
console.log(d.getMonth()); //5 (starts from 0)
console.log(d.getHours()); //17
console.log(d.getMinutes()); //30
console.log(d.getSeconds()) //13
console.log(d.getMilliseconds()); //765
console.log(d.getTime()) //1591868420160
console.log(d.getTimezoneOffset()); //-480 返回以分钟为单位表示的时区差异

getTimezoneOffset()方法用于说明某个时区与UTC时间的关系,该方法返回当前时区比UTC提前或落后的分钟数; 还可以用于判断该时区是否使用夏令时:

var d1=new Date(2020, 0, 1);
var d2=new Date(2020, 6, 1);
console.log(d1.getTimezoneOffset());  // -480 / 60 = -8小时
var b=d1.getTimezoneOffset() != d2.getTimezoneOffset();  // 判断夏令时
console.log(b);

这些方法有等效的UTC版本,它们返回UTC值而不是适合您当前时区的值

var d = new Date();
console.log(d.getUTCDate()); //18
console.log(d.getUTCDay());  //4
console.log(d.getUTCFullYear()); //2020
console.log(d.getUTCMonth()); //5 (starts from 0)
console.log(d.getUTCHours()); //9
console.log(d.getUTCMinutes()); //30
console.log(d.getUTCSeconds()) //13
console.log(d.getUTCMilliseconds()); //765

setter方法:

var d = new Date();
d.setDate(6);
d.setFullYear(2022);
d.setMonth(4);
d.setHours(4);
d.setMinutes(4);
d.setSeconds(4);
d.setMilliseconds(123);
d.setTime(1598765678999);
console.log(d);

注:setDate 和 setMonth 从 0 开始编号;

这些方法基本是跟getter方法一一对应的,但是没有setDay方法,因为星期几是计算出来的,而不是设置的;

set方法中的参数如果超出它的范围,会进位,称为冒泡,如:date.setHours(48),这也会将日期数变大;

var date = new Date();
date.setFullYear(2022,1,18);
// date.setMonth(24);
date.setMonth(2,8);
date.setHours(16,18,28,208);
console.log(date.toLocaleString());

如果参数是负数,表示从上个月的最后一天开始减去相应的单位数:

以上的方法都有一个相对应的 UTC set方法:

var d = new Date();
d.setUTCDate(6);
d.setUTCFullYear(2022);
d.setUTCMonth(4);
d.setUTCHours(4);
d.setUTCMinutes(4);
d.setUTCSeconds(4);
d.setUTCMilliseconds(123);
console.log(d);

获取当前时间戳:

console.log(new Date().getTime());
console.log(Date.now());

Date.now()方法返回表示调用这个方法时的日期和时间的毫秒数;其简化了Date.getTime()方法,如:

var start = Date.now();
for(var i=0;i<100000;i++){} // 模拟其他处理代码
var stop = Date.now();
var result = stop-start;
alert(result);

如果有些浏览器不支持Date.now(),可以使用+操作符获取Date对象的时间戳,如:

var start = +new Date();
for(var i=0;i<100000;i++){} // 模拟其他处理代码
var stop = +new Date();
var result = stop-start;
alert(result);

日期的计算:

直接加减或通过 Date.getTime() 的值来比较两个 Date 对象:

var d1 = new Date("2020-06-18");
var d2 = new Date("2020-06-19");
console.log(d1 - d2);  // -86400000
console.log(d1 + d2);  // 返回两个日期的字符串拼接
// 或
var d1 = new Date('July 18,2020 14:10:18');
var d2 = new Date('July 19,2020 14:10:18');
var diff = d2.getTime() - d1.getTime();
console.log(diff);

注:getTime() 方法返回以毫秒计的数字,所以需要将当日时刻计入;如:July 18, 2020 14:14:14 不等于July 18, 2020。在这种情况下,可以使用 setHours(0, 0, 0, 0) 来重置当日时刻;

计算本年度还剩下多少天:

function leftDays() {
  var today = new Date();
  var endYear = new Date(today.getFullYear(), 11, 31, 23, 59, 59, 999);
  var msPerDay = 24 * 60 * 60 * 1000;
  return Math.round((endYear.getTime() - today.getTime()) / msPerDay);
}
console.log(leftDays());

小练习:

// 中文月份和星期
var d = new Date();
var month = d.getMonth();
var week = d.getDay();
var monthArr = ['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月'];
var weekArr = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];
console.log(monthArr[month]);
console.log(weekArr[week]);
 
// 获取日期部分信息
Date.prototype.datePart = function(part){
    if(!part)
        part = 'd';
    var weekArr = ['日','一','二','三','四','五','六'];
    switch(part){
        case 'Y':
        case 'y': 
            return this.getFullYear(); 
            break;
        case 'M': 
            return this.getMonth + 1;
            break;
        case 'W':
        case 'w':
            return weekArr[this.getDay()];
            break;
        case 'D':
        case 'd':
            return this.getDate();
            break;
        case 'H':
        case 'h':
            return this.getHours();
            break;
        case 'm':
            return this.getMinutes();
            break;
        case 's':
            return this.getSeconds();
            break;
        default:
            return this.getDate();
    }
    return this.getDate();
}
console.log(new Date().datePart('d'));

还有多长时间退休:

// 一个人到退休还有多长时间
function retireDays(birthday,age){
    var d1 = new Date(birthday).getFullYear();
    var d2 = new Date().getFullYear();
    var old = d2 - d1;
    console.log("现在你的年龄是:" + old,",将于" + (d1 + age) + "退休");
    if(age - old > 0){
        console.log("还差"+(age - old)+"年退休")
    }else{
        console.log("你已经退休啦,好好享受老年生活吧");
    }
}
retireDays('2020.6.6',60);

倒计时:

<!-- 网页时钟 -->
<p id="mydate"></p>
<script>
function checkTime(i){
    if(i<10)
        i = '0' + i;
    return i;
}
function startTime(){
    var d = new Date();
    var h = d.getHours();
    var m = checkTime(d.getMinutes());
    var s = checkTime(d.getSeconds());
    document.getElementById('mydate').innerHTML = h + ':' + m + ':' + s;
    timer = setTimeout('startTime()', 1000);
}
startTime();
 
// 倒计时
function getCountDown(d){
    var d1 = new Date();
    var d2 = new Date(d);  // 
    var diff = d2 - d1;     // 相差毫秒数
    var o = {};
    if(diff >= 0){
        var day = Math.floor(diff / 1000 / 60 / 60 / 24);  // 剩下多少天
        var hour = Math.floor(diff / 1000 / 60 / 60 % 24);   // 剩下多少小时
        var minute = Math.floor(diff / 1000 / 60 % 60);     // 剩下多少分
        var second = Math.floor(diff / 1000 % 60);  // 剩下多少秒
        o.stop = false;
        o.str = "距离"+d+",还剩下"+day+"天"+hour+"小时"+minute+"分"+second+"秒";
    }else{
        o.stop = true;
        o.str = "已时结束";
    }
    return o;
}
var timer = setInterval(function(){
    var mydate = document.getElementById('mydate');
    mydate.innerHTML = getCountDown('2020.6.8').str;
    if(getCountDown('2020.6.8').stop) clearInterval(timer);
},1000);

计算某个日期加上天数:

// 计算加几天后的日期,days可以使用负数
// 如果计算月份,是一样的原理
function addDate(date,days){
    var d = new Date(date);
    d.setDate(d.getDay() + days);
    var month = d.getMonth() + 1;
    var day = d.getDate();
    if(month < 10)
        month = "0" + month;
    if(day < 10)
        day = "0" + day;
    var value = d.getFullYear() + "-" + month + "-" + day;
    return value;
}
console.log(addDate('2020-6-6',50));
console.log(addDate('2020-6-6',-6));

小练习:

// 判断闰年:四年一闰,百年不闰,四百年再闰
Date.prototype.isLeapYear = function(){
    return (this.getFullYear() % 4 == 0 && ((this.getFullYear() % 100 !=0) || (this.getFullYear() % 400 == 0)));
}
var d = new Date();
console.log(d.isLeapYear());
d.setFullYear(2019);
console.log(d.isLeapYear());
 
// 计算两个日期的天数差
function daysDiff(dateOne,dateTwo){
    var oneMonth = dateOne.substring(5, dateOne.lastIndexOf('-'));
    var oneDay = dateOne.substring(dateOne.length,dateOne.lastIndexOf('-') + 1);
    var oneYear = dateOne.substring(0, dateOne.indexOf('-'));
    var twoMonth = dateTwo.substring(5, dateTwo.lastIndexOf('-'));
    var twoDay = dateTwo.substring(dateTwo.length, dateTwo.lastIndexOf('-') + 1);
    var twoYear = dateTwo.substring(0, dateTwo.indexOf('-'));
    var diff = ((Date.parse(oneMonth+'/'+oneDay+'/'+oneYear) - Date.parse(twoMonth+'/'+twoDay+'/'+twoYear)) / 86400000);
    return diff;
}
console.log(daysDiff('2020-6-6','2020-5-30'));

格式化输出:

Date.prototype.format = function(fmt){
    var o = {
        "M+" : this.getMonth() + 1,
        "d+" : this.getDate(),
        "h+" : this.getHours(),
        "m+" : this.getMinutes(),
        "s+" : this.getSeconds(),
        "q+" : Math.floor((this.getMonth() + 3) / 3),
        "S"  : this.getMilliseconds()
    };
    if(/(y+)/.test(fmt)){
        fmt = fmt.replace(RegExp.$1,
            (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    }
    for(var k in o){
        if(new RegExp("(" + k + ")").test(fmt)){
            fmt = fmt.replace(RegExp.$1,
                RegExp.$1.length ===1
                    ? o[k]
                    : ("00" + o[k]).substr(("" + o[k]).length));
        }
    }
    return fmt;
};
var d = new Date(2020,6,6,0,0,0);
console.log(d);
console.log(d.format('yyyy年MM月dd日'));  // 2020年07月06日
console.log(d.format('yyyy年MM月d日 hh:mm:ss'));  // 2020年07月6日 00:00:00

Intl对象:

Intl 对象是 ECMAScript 国际化 API 的一个命名空间,它提供了精确的字符串对比(Collator ),数字格式化(NumberFormat),日期和时间格式化(DateTimeFormat)等对象。

var date = new Date();
console.log(date);
console.log(Intl.DateTimeFormat().format(date));  // 2020/7/22
console.log(new Intl.DateTimeFormat('en-US').format(date));  // 6/7/2020

Intl对象的属性:

  • Intl.Collator:collators的构造函数,用于启用对语言敏感的字符串比较的对象。
  • Intl.DateTimeFormat:用于启用语言敏感的日期和时间格式的对象的构造函数。
  • Intl.ListFormat:启用语言敏感列表格式的对象的构造函数。
  • Intl.NumberFormat:用于启用语言敏感数字格式的对象的构造函数。
  • Intl.PluralRules:用于启用多种敏感格式和多种语言语言规则的对象的构造函数。
  • Intl.RelativeTimeFormat:对象的构造函数,该对象启用对语言敏感的相对时间格式。

Intl.DateTimeFormat:

语法:

new Intl.DateTimeFormat([locales[, options]])
Intl.DateTimeFormat([locales[, options]])

参数:

locales:可选,缩写语言代码(BCP 47 language tag),如:cmn-Hans-CN)的字符串或者这些字符串组成的数组;

两种扩展的格式:language[-scripts][-region]-u-nu-* 和 language[-scripts][-region]-u-ca-* ;例如:zh-u-nu-hanidec(表示中文十进制数字) 和 zh-u-ca-chinese(表示中国日历,比如壬辰年冬月8日) ,也可以 nu 和 ca 组合使用,如使用:zh-u-ca-chinese-nu-hanidec 格式化Date.now()的返回值类似于"丙申年冬月九日";

nu:编号系统,可能的值包括:

"arab", "arabext", "bali", "beng", "deva", "fullwide", "gujr", "guru", "hanidec", "khmr", "knda", "laoo", "latn", "limb", "mlym", "mong", "mymr", "orya", "tamldec", "telu", "thai", "tibt".

ca:日历,可能的值包括:

"buddhist", "chinese", "coptic", "ethioaa", "ethiopic", "gregory", "hebrew", "indian", "islamic", "islamicc", "iso8601", "japanese", "persian", "roc".

var date = new Date();
// 韩国使用 year-month-day 格式
console.log(new Intl.DateTimeFormat('ko-KR').format(date));
// 2020. 6. 18
 
//大部分阿拉伯国家使用阿拉伯字母(real Arabic digits)
console.log(new Intl.DateTimeFormat('ar-EG').format(date));
// "???/???/????"
 
//在日本,应用可能想要使用日本日历,
//2020 是平成32年(平成是是日本天皇明仁的年号,由1989年1月8日起开始计算直至现在)
console.log(new Intl.DateTimeFormat('ja-JP-u-ca-japanese').format(date));
// 类似"平成32/6/20"
 
//当请求一个语言可能不支持,如巴厘(ban),若有备用的语言印尼语(id),
//那么将使用印尼语(id)
console.log(new Intl.DateTimeFormat(['ban', 'id']).format(date));
// "20/6/2020"
 
console.log(new Intl.DateTimeFormat('zh-CN').format(date));  // 2020/6/11
console.log(new Intl.DateTimeFormat('zh-u-nu-hanidec').format(date)); //二〇二〇/六/一一
console.log(new Intl.DateTimeFormat('zh-u-ca-chinese').format(date));//37/闰4/20
console.log(new Intl.DateTimeFormat('zh-u-ca-chinese-nu-hanidec').format(date));//三七/闰四/二〇

options参数:

可选,自定义输出,包含一些或所有的下面属性:

localeMatcher:

使用的local的匹配算法. 可能的值有"lookup"和"best fit"; 默认值 "best fit";

timeZone:

使用的时区. 这唯一的值实现必须被标准世界时间(UTC)所识别。默认值是运行时的默认时区. IANA time zone database中的时区名称可能会被识别, 例如"Asia/Shanghai", "Asia/Kolkata", "America/New_York";

hour12:

是否使用12小时时间制(而不是24小时的时间),值是true 或 false; 默认值是根据locale来自动决定的(中国地区的默认值为true);

formatMatcher:

format的匹配算法,值有"basic"和"best fit",默认值是"best fit";

日期时间插件被格式化输出时可以使用的属性集合描述。实现需要支持是以下子集中的其中一个:

  • weekday, year, month, day, hour, minute, second
  • weekday, year, month, day
  • year, month, day
  • year, month
  • month, day
  • hour, minute, second
  • hour, minute

实现可能支持其他的子集,并通过对所有可用的子集对比找到最匹配的子集。通过 formatMatcher属性可以设置两种算法用于对比和选择子集: 完全匹配"basic"算法和一种依赖于“best fit”算法的实现;

  • weekday:工作日的展现方式.可能的值有 "narrow", "short", "long".
  • era:纪元的展现方式. 可能的值有 "narrow", "short", "long".
  • year:年的展现方式. 可能的值有 "numeric", "2-digit".
  • month:月的展现方式. 可能的值有 "numeric", "2-digit", "narrow", "short", "long".
  • day:日的展现方式.可能的值有 "numeric", "2-digit".
  • hour:时的展现方式.可能的值有 "numeric", "2-digit".
  • minute:分钟的展现方式.可能的值有 "numeric", "2-digit".
  • second:秒的展现方式. 可能的值有"numeric", "2-digit".
  • timeZoneName:时区名称的展现方式.可能的值有 "short", "long".

每个日期时间组件属性的默认值都是undefined,但是若所有的组件属性都是undefined,那么year, month和day的值就都被认为是"numeric";

var date = new Date();
var options = {year:'numeric',month:'numeric',day:'numeric',hour:'numeric',minute:'numeric',second:'numeric'};
console.log(new Intl.DateTimeFormat('en-US').format(date));  // 6/7/2020
console.log(new Intl.DateTimeFormat('en-US',options).format(date));  // 6/7/2020, 3:07:31 PM
console.log(new Intl.DateTimeFormat('it-IT').format(date));  // 7/6/2020
console.log(new Intl.DateTimeFormat('it-IT',options).format(date));  // 7/6/2020, 15:08:34
 
var date = new Date(Date.UTC(2020, 6, 18, 6, 30, 18));
 
//请求参数(options)中包含参数星期(weekday),并且该参数的值为长类型(long)
var options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
console.log(new Intl.DateTimeFormat('zh-CN', options).format(date));
console.log(new Intl.DateTimeFormat('de-DE', options).format(date));
// Samstag, 18. Juli 2020
 
// 一个应用使用 世界标准时间(UTC),并且UTC使用短名字(short)展示
options.timeZone = 'UTC';
//若不写这一行那么仍然显示的是世界标准时间;但是UTC三个字母不会显示
options.timeZoneName = 'short';
console.log(new Intl.DateTimeFormat('en-US', options).format(date));
// Saturday, July 18, 2020, UTC
 
// 更精确的定义
options = {
  hour: 'numeric', minute: 'numeric', second: 'numeric',
  timeZoneName: 'short'
};
console.log(new Intl.DateTimeFormat('en-US', options).format(date));
// 12:30:18 PM GMT+8
 
// 使用24小时制
options = {
  year: 'numeric', month: 'numeric', day: 'numeric',
  hour: 'numeric', minute: 'numeric', second: 'numeric',
  hour12: false
};
console.log(date.toLocaleString('en-US', options));  // 7/18/2020, 14:30:18
console.log(date.toLocaleString('zh-CN', options));  // 2020/7/18 14:30:18

日期插件库:

Datejs 是一个开源的JavaScript库,用来解析、格式化和处理日期数据,支持多种语言的日期格式处理;官网:www.datejs.com/

Moment.js 是一个简单易用的轻量级JavaScript日期处理类库,提供了日期格式化、日期解析等功能。它支持在浏览器和NodeJS两种环境中运行;

date-fns库:现代 JavaScript 日期实用程序库。date-fns 提供了最全面,最简单和一致的工具集,用于在浏览器和 Node.js 中操作 JavaScript 日期;官网:date-fns.org

Prettydate 是一个 jQuery 用来显示一些用户友好的日期格式的插件,例如Posted 2 days ago by John Resig;

Countdown是jQuery的一个用于显示倒计时的插件;

XDate是一个对Javascirpt本地Date对象的轻度包装,它提供对日期的解析、格式化以及其他操作的较强功能;

DP_DateExtensions库继承了JavaScript的Date对象,并添加了一些新特性和功能;

组件类:

layDate 日期与时间组件,layDate 是 layui 独立维护的三大组件之一;官网:www.layui.com/laydate/。


Web前端开发之Javascript-零点程序员-王唯