ie8下new Date()指定时间

为解决在IE8下创建指定日期时间对象的问题,本文介绍了一个JavaScript函数,该函数能在IE8及火狐浏览器中生成正确的时间对象,避免了NaN输出。通过正则表达式验证日期格式并调整Date对象,确保跨浏览器兼容性。

项目开发中很可能会需要创建一个指定日期的时间对象,火狐浏览器可以直接使用new Date('yyyy-mm-dd')生成时间,但是在ie8下就会发现生成的时间输出的是NaN-NaN-NaN。为了兼容可恨的ie我们必须做一些特殊处理大哭,调用下面的js函数就可以在ie8下生成正确的时间对象,拿走不谢。亲测火狐、ie8可用,其它浏览器未测试,如有错误欢迎大家指正。

/*
 *    根据时间字符串 生成时间对象 
 *     dateStr 时间字符串 yyyy-mm-dd
 */
function parseDate(dateStr) {
    var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)\s*$/;//正则
    var date = new Date(NaN);
    var parts = isoExp.exec(dateStr);//正则验证
    if(parts) {
        var month = Number(parts[2]);
        //设置时间
        date.setFullYear(parts[1], month - 1, parts[3]);
        //判断是否正确
        if(month != date.getMonth() + 1) {
            date.setTime(NaN);
        }
    }
    return date;
}

 

转载于:https://www.cnblogs.com/LFBlog/p/6605602.html

<think> 我们正在讨论JavaScript中的`new Date("2000-1-1")`,这是一个创建日期对象的常见方式。下面我将从多个角度解释其用法和注意事项。 </think> ### JavaScript 中 `new Date("2000-1-1")` 的解析与应用 #### 1. **基本含义与作用** `new Date("2000-1-1")` 是 JavaScript 中创建 **日期对象** 的标准语法: - **功能**:解析字符串 `"2000-1-1"` 并生成一个表示 **2000 年 1 月 1 日** 的 `Date` 对象。 - **返回值**:返回一个 `Date` 对象实例,而非字符串(区别于 `Date()` 无 `new` 的调用[^4])。 - **核心用途**: - 日期计算(如计算时间间隔) - 日期格式化(输出特定格式的日期字符串) - 约束日期范围(如日期选择器的 `minDate` 或 `maxDate`[^3]) #### 2. **使用场景示例** **(1) 日期范围计算** 计算两个日期的间隔天数(引用[3]的优化实现): ```javascript const start = new Date("2000-01-01"); const end = new Date("2000-01-31"); const days = (end - start) / (1000 * 60 * 60 * 24); // 30天 ``` - **原理**:`end - start` 返回毫秒差,通过单位换算得到天数[^3]。 **(2) 日期格式化** 将 `Date` 对象转为中文格式(引用[2]的扩展): ```javascript const date = new Date("2000-1-1"); const weekdays = ["日", "一", "二", "三", "四", "五", "六"]; const str = `${date.getFullYear()}年${date.getMonth()+1}月${date.getDate()}日 周${weekdays[date.getDay()]}`; // 输出:"2000年1月1日 周六" ``` **(3) 日期约束** 在日期选择器中限制可选范围(Vue 示例): ```javascript export default { data() { return { minDate: new Date("2000-01-01"), // 最小日期 maxDate: new Date("2005-12-31") // 最大日期 }; } }; ``` #### 3. **关键注意事项** **(1) 时区问题** - **现象**:`new Date("2000-1-1")` 可能因运行环境时区不同而解析为不同时间点。 ```javascript // UTC+8 时区下: new Date("2000-1-1").toISOString(); // "1999-12-31T16:00:00.000Z"(UTC 时间) ``` - **解决方案**: - 使用 **ISO 8601 格式**(`"2000-01-01"`)确保跨时区一致性。 - 显式指定时区:`new Date("2000-01-01T00:00:00+08:00")`。 **(2) 浏览器兼容性** - **日期格式差异**: - `"2000-1-1"` 在 Chrome/Firefox 中有效,但 Safari 可能报错(推荐使用 `"2000/01/01"` 或 ISO 格式)。 - **旧版 IE 问题**:IE 8 及以下不支持 ISO 格式解析(需用 `new Date(2000, 0, 1)`)。 **(3) 日期对象与字符串的混淆** - **错误示例**: ```javascript const d1 = Date("2000-1-1"); // 返回字符串,非 Date 对象! d1.getFullYear(); // TypeError: d1.getFullYear is not a function ``` - **正确做法**:必须使用 `new Date(...)` 创建对象[^4]。 #### 4. **最佳实践总结** | **场景** | **推荐写法** | **原因** | |-------------------------|----------------------------------|------------------------------| | 创建日期对象 | `new Date("2000-01-01")` | ISO 格式避免时区歧义 | | 兼容旧浏览器 | `new Date(2000, 0, 1)` | 参数化构造兼容所有浏览器 | | 格式化输出 | 使用 `Intl.DateTimeFormat` API | 内置国际化支持 | | 复杂日期计算 | 引入库(如 `date-fns`、`Day.js`)| 简化操作且避免时区陷阱 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值