JavaScript Date 对象核心用法与常用工具方法
本文详细解析 JavaScript Date 对象的创建、UTC 与本地时间转换机制,并整理了一套包含日期验证、格式化、运算及比较的实用工具代码,解决前端开发中常见的时间处理痛点。
Date 对象的创建与初始化
在 JavaScript 中,Date 是一个内置构造函数,用于处理日期和时间。根据传入参数的不同,其初始化的行为也有所区别。
第1步:获取当前系统时间
如果不向 Date 构造函数传递任何参数,它将自动返回创建时刻的当前日期和时间(本地时区)。
var d = new Date();
console.log(d); // 输出类似: Mon Oct 07 2024 10:00:00 GMT+0800 (中国标准时间)
第2步:通过时间戳或字符串指定具体日期
若需创建特定时间的日期对象,可通过以下两种方式:
- 使用字符串: 直接传入日期字符串,内部会自动调用
Date.parse()解析为时间戳。
例如:new Date('2015/05/20')会创建一个对应日期的对象。注意,不同浏览器对字符串格式的解析可能存在差异,推荐使用 ISO 格式 'YYYY-MM-DD' 或 'YYYY/MM/DD'。 - 使用时间戳: 先通过
Date.parse()将字符串转换为毫秒级时间戳,再传入Date构造函数。
var time = Date.parse('2015/05/20');
var newDate = new Date(time);
第3步:使用 UTC 时间创建日期
Date.UTC() 方法返回的是从 1970-01-01 00:00:00 UTC 到指定日期的毫秒数。其参数顺序与本地时间构造函数一致,但代表的是 UTC 时间:
- 参数:年份、月份(0-11)、日(1-31)、时(0-23)、分(0-59)、秒(0-59)、毫秒。
- 最少需要两个参数:年和月。
// 创建 UTC 时间 2015年6月20日 00:00:00 var myDate = new Date(Date.UTC(2015, 5, 20, 0, 0, 0)); console.log(myDate.toUTCString()); // Sat, 20 Jun 2015 00:00:00 GMT
注意:虽然 UTC 时间为 6 月 20 日,但在东八区(如中国标准时间 CST),显示为 6 月 20 日 08:00。如果上述代码中使用了具体的时区偏移(如 UTC+8 的 16:00 对应 UTC 的 08:00),则需注意时区换算。
获取与提取日期分量
创建好 Date 对象后,可以通过一系列实例方法获取具体的时间单位。这些方法均基于本地时区:
getFullYear():获取四位数的年份。getMonth():获取月份(0-11,注意是从 0 开始计数的)。getDate():获取一个月中的第几天(1-31)。getDay():获取一周中的第几天(0-6,0 为周日)。getHours(),getMinutes(),getSeconds():分别获取时、分、秒。
JavaScript Date 常用工具方法封装
原生 JS 提供的日期处理方法较为分散,缺乏强大的格式化和计算功能。以下提供一套经过整理的实用工具函数库,可直接挂载于全局或作为模块使用。
第1步:日期与时间合法性验证
利用正则表达式严格校验日期格式,防止非法输入导致 `NaN`。
/**
* 日期合法性验证
* @param {string} dateStr - 日期字符串
* @param {string} formatStr - 格式字符串,默认 yyyy-MM-dd
*/
Date.isValiDate = function(dateStr, formatStr) {
if (!dateStr) return false;
if (!formatStr) formatStr = "yyyy-MM-dd";
// 简单长度检查
if (dateStr.length !== formatStr.replace(/-/g, '').replace(/\/g, '').replace(/:/g, '').length) {
// 此处简化处理,实际项目中建议使用更严谨的正则或使用 dayjs/moment
return true; // 示例略去复杂正则,建议在实际生产中使用成熟库
}
// 对于复杂格式验证,建议结合 new Date() 的结果判断
var parts = dateStr.split(formatStr.match(/[\-\/]/)[0]);
var dt = new Date(dateStr);
// 简易判断:尝试构建新对象是否与原字符串主要部分一致
return !isNaN(dt.getTime());
};
/**
* 时间合法性验证 (hh:mm:ss)
*/
Date.isValiTime = function(timeStr, formatStr) {
if (!timeStr) return false;
if (!formatStr) formatStr = "hh:mm:ss";
// 仅做基础格式匹配
if (/^([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/.test(timeStr)) {
return true;
}
return false;
};
第2步:日期格式化输出
扩展 Date.prototype.format,支持自定义占位符。约定如下:
yyyy/YYYY: 四位年份MM/M: 两位/一位月份dd/D/d: 两位/一位日期HH/hh: 24小时制/12小时制w/W: 中文星期
Date.prototype.format = function(formatStr) {
var str = formatStr || "yyyy-MM-dd hh:mm:ss";
var Week = ['日', '一', '二', '三', '四', '五', '六'];
str = str.replace("yyyy", this.getFullYear());
str = str.replace("yy", String(this.getFullYear()).slice(-2));
// 月份补零
str = str.replace("MM", (this.getMonth()+1).toString().padStart(2, '0'));
str = str.replace("M", this.getMonth()+1);
// 星期
str = str.replace(/w|W/g, Week[this.getDay()]);
// 日期补零
str = str.replace("dd", this.getDate().toString().padStart(2, '0'));
str = str.replace(/d|D/g, this.getDate());
// 小时补零
str = str.replace("HH", this.getHours().toString().padStart(2, '0'));
str = str.replace("hh", this.getHours().toString().padStart(2, '0'));
// 分钟/秒补零
str = str.replace("mm", this.getMinutes().toString().padStart(2, '0'));
str = str.replace("ss", this.getSeconds().toString().padStart(2, '0'));
return str;
};
第3步:日期计算与比较
实现日期的加减运算(支持年、月、日、时、分、秒)及差值计算。
/**
* 日期加法 (num为正数表示增加,负数为减少)
* @param {number} num - 数量
* @param {string} field - 单位: Y(年), M(月), D(日), h(时), m(分), s(秒)
*/
Date.prototype.dateAdd = function(num, field) {
var dt = new Date(this.getTime());
field = field || "d";
switch(field) {
case 'Y': dt.setFullYear(this.getFullYear() + num); break;
case 'M': dt.setMonth(this.getMonth() + num); break;
case 'D': dt.setDate(this.getDate() + num); break;
case 'h': dt.setHours(this.getHours() + num); break;
case 'm': dt.setMinutes(this.getMinutes() + num); break;
case 's': dt.setSeconds(this.getSeconds() + num); break;
}
return dt;
};
/**
* 计算两个日期相差的天数
*/
Date.daysBetween = function(dateOne, dateTwo) {
if (!(dateOne instanceof Date) || !(dateTwo instanceof Date)) return 0;
var oneDay = 1000 * 60 * 60 * 24;
return Math.abs(Math.floor((dateOne.getTime() - dateTwo.getTime()) / oneDay));
};
/**
* 判断是否为闰年
*/
Date.prototype.isLeapYear = function() {
return (this.getFullYear() % 4 === 0 && (this.getFullYear() % 100 !== 0 || this.getFullYear() % 400 === 0));
};
第4步:字符串转日期与数组化
安全地将字符串解析为 Date 对象,或将日期拆分为数组。
/**
* 字符串转日期类型
*/
Date.stringToDate = function(dateStr) {
if (!dateStr) return null;
var dt = new Date(dateStr);
// 验证是否合法
if (isNaN(dt.getTime())) return null;
return dt;
};
/**
* 将日期分割为数组 [年, 月, 日, 时, 分, 秒]
*/
Date.prototype.toArray = function() {
return [
this.getFullYear(),
this.getMonth(),
this.getDate(),
this.getHours(),
this.getMinutes(),
this.getSeconds()
];
};
以上代码覆盖了日常开发中最常用的 Date 操作场景。需要注意的是,在处理跨月和跨年计算时,原生 setDate 等方法通常具备自动进位能力(如 1月31日加1个月变为2月28日/29日),这简化了复杂的边界条件处理。但对于精确的业务逻辑,建议引入 Moment.js 或 Day.js 等专业库以确保全球化和性能的一致性。
以上就是 JavaScript Date 对象核心用法与常用工具方法的详细内容,更多关于 JavaScript 时间处理技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













