概述

在写一门语言的代码的时候,时间操作往往是一个不可缺少而且又复杂的一项,本文就记录一下 JavaScript 中关于日期时间的一些常见操作。本文的所有操作都基于 Chrome,未在 IE 中测试,需注意。

Date 操作

字符串转 Date

标准 ISO 时间

  1. [root@liqiang.io]# cat date.js
  2. var d = new Date("2015");
  3. var d = new Date("2015-03");
  4. var d = new Date("2015-03-25");
  5. var d = new Date("2015-03-25T12:00:00Z");
  6. var d = new Date("2015-03-25T12:00:00-06:30");

js 时间格式

  1. [root@liqiang.io]# cat date.js
  2. var d = new Date("03/25/2015"); // JavaScript Short Dates.
  3. var d = new Date("Mar 25 2015"); // JavaScript Long Dates.
  4. var d = new Date("25 Mar 2015"); // 也是 OK
  5. var d = new Date("January 25 2015"); // 也没问题
  6. var d = new Date("JANUARY, 25, 2015"); // 逗号可以忽略

Date 输入组件

  1. [root@liqiang.io]# cat date.js
  2. var msec = Date.parse("March 21, 2012");
  3. var d = new Date(msec);

自定义解析格式

  1. [root@liqiang.io]# cat date.js
  2. /**
  3. * 将字符串解析成日期
  4. * @param str 输入的日期字符串,如'2014-09-13'
  5. * @param fmt 字符串格式,默认'yyyy-MM-dd',支持如下:y、M、d、H、m、s、S,不支持w和q
  6. * @returns 解析后的Date类型日期
  7. */
  8. function parseDate(str, fmt)
  9. {
  10. fmt = fmt || 'yyyy-MM-dd';
  11. var obj = {y: 0, M: 1, d: 0, H: 0, h: 0, m: 0, s: 0, S: 0};
  12. fmt.replace(/([^yMdHmsS]*?)(([yMdHmsS])\3*)([^yMdHmsS]*?)/g, function(m, $1, $2, $3, $4, idx, old)
  13. {
  14. str = str.replace(new RegExp($1+'(\\d{'+$2.length+'})'+$4), function(_m, _$1)
  15. {
  16. obj[$3] = parseInt(_$1);
  17. return '';
  18. });
  19. return '';
  20. });
  21. obj.M--; // 月份是从0开始的,所以要减去1
  22. var date = new Date(obj.y, obj.M, obj.d, obj.H, obj.m, obj.s);
  23. if(obj.S !== 0) date.setMilliseconds(obj.S); // 如果设置了毫秒
  24. return date;
  25. }
  26. parseDate('2016-08-11'); // Thu Aug 11 2016 00:00:00 GMT+0800
  27. parseDate('2016-08-11 13:28:43', 'yyyy-MM-dd HH:mm:ss') // Thu Aug 11 2016 13:28:43 GMT+0800

Date 转字符串

默认方法

  1. [root@liqiang.io]# cat date.js
  2. var time = 0;
  3. time = new Date(1507601410000);//毫秒转日期格式
  4. console.log("time:"+time);
  5. console.log("time.toDateString():"+time.toDateString());
  6. console.log("time.toJSON():"+time.toJSON());
  7. console.log("time.toUTCString():"+time.toUTCString());
  8. console.log("time.toLocaleDateString():"+time.toLocaleDateString());
  9. console.log("time.toLocaleString():"+time.toLocaleString());
  10. console.log("time.toLocaleTimeString():"+time.toLocaleTimeString());
  11. console.log("time.valueOf():"+time.valueOf());

结果:

  1. [root@liqiang.io]# console
  2. time:Tue Oct 10 2017 10:10:10 GMT+0800 (Hong Kong Standard Time)
  3. VM150:4 time.toDateString():Tue Oct 10 2017
  4. VM150:5 time.toJSON():2017-10-10T02:10:10.000Z
  5. VM150:6 time.toUTCString():Tue, 10 Oct 2017 02:10:10 GMT
  6. VM150:7 time.toLocaleDateString():10/10/2017
  7. VM150:8 time.toLocaleString():10/10/2017, 10:10:10 AM
  8. VM150:9 time.toLocaleTimeString():10:10:10 AM
  9. VM150:10 time.valueOf():1507601410000

自定义特定格式

  1. [root@liqiang.io]# cat date.js
  2. Date.prototype.addHours = function(h) {
  3. this.setTime(this.getTime() + (h*60*60*1000));
  4. return this;
  5. }
  6. Date.prototype.yyyymmdd = function() {
  7. var mm = this.getMonth() + 1; // getMonth() is zero-based
  8. var dd = this.getDate();
  9. return [this.getFullYear(),
  10. (mm>9 ? '' : '0') + mm,
  11. (dd>9 ? '' : '0') + dd
  12. ].join('');
  13. };
  14. var date = new Date();
  15. date.addHours(18);
  16. date.yyyymmdd();

自定义通用格式

  1. [root@liqiang.io]# cat date.js
  2. <script>
  3. var time = 0;
  4. time = new Date(1507601410256);//毫秒转日期格式
  5. console.log("time:"+time);
  6. //使用函数的方式进行定义
  7. function dateFormat(fmt,date){
  8. var o = {
  9. "M+" : date.getMonth()+1, //月份
  10. "d+" : date.getDate(), //日
  11. "h+" : date.getHours(), //小时
  12. "m+" : date.getMinutes(), //分
  13. "s+" : date.getSeconds(), //秒
  14. "q+" : Math.floor((date.getMonth()+3)/3), //季度
  15. "S" : date.getMilliseconds() //毫秒
  16. };
  17. if(/(y+)/.test(fmt)){
  18. fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));
  19. }
  20. for(var k in o)
  21. if(new RegExp("("+ k +")").test(fmt))
  22. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
  23. return fmt;
  24. }
  25. //使用原型方法的方式定义
  26. Date.prototype.timeFormat = function(fmt){
  27. var o = {
  28. "M+" : this.getMonth()+1, //月份
  29. "d+" : this.getDate(), //日
  30. "h+" : this.getHours(), //小时
  31. "m+" : this.getMinutes(), //分
  32. "s+" : this.getSeconds(), //秒
  33. "q+" : Math.floor((this.getMonth()+3)/3), //季度
  34. "S" : this.getMilliseconds() //毫秒
  35. };
  36. if(/(y+)/.test(fmt)){
  37. fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
  38. }
  39. for(var k in o)
  40. if(new RegExp("("+ k +")").test(fmt))
  41. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
  42. return fmt;
  43. }
  44. //调用
  45. console.log("dateFormat():"+dateFormat("MM-dd hh:mm 第q季度",time));
  46. console.log("dateFormat():"+dateFormat("yyyy-MM-dd hh:mm:s 第q季度",time));
  47. console.log("dateFormat():"+dateFormat("yyyy年MM月dd日 hh时mm分ss秒S毫秒 第q季度",time));
  48. console.log("time.timeFormat():"+time.timeFormat("MM-dd hh:mm 第q季度"));
  49. console.log("time.timeFormat():"+time.timeFormat("yyyy-MM-dd hh:mm:s 第q季度"));
  50. console.log("time.timeFormat():"+time.timeFormat("yyyy年MM月dd日 hh时mm分ss秒S毫秒 第q季度"));
  51. </script>

比较时间

  1. [root@liqiang.io]# cat date_compare.js
  2. let d1 = new Date("2024-7-15");
  3. let d2 = new Date("2023/07/16");
  4. console.log("d1 > d2:"+ (d1 > d2));