JavaScript Date 对象核心用法与常用工具方法

Felix
Felix
发布时间:2026-10-13 | 2人浏览过
原创

本文详细解析 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步:通过时间戳或字符串指定具体日期

若需创建特定时间的日期对象,可通过以下两种方式:

  1. 使用字符串: 直接传入日期字符串,内部会自动调用 Date.parse() 解析为时间戳。
    例如:new Date('2015/05/20') 会创建一个对应日期的对象。注意,不同浏览器对字符串格式的解析可能存在差异,推荐使用 ISO 格式 'YYYY-MM-DD' 或 'YYYY/MM/DD'。
  2. 使用时间戳: 先通过 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 时间处理技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表