js的Date.parse()方法和getTime()的陷阱

这篇博客揭示了JavaScript中getTime()和Date.parse()方法在处理日期时可能遇到的时区问题。当日期字符串以'-'分隔时,Date.parse()会按UTC时区解析,导致结果比预期早8小时。解决方案是使用其他分隔符,如'/'. 这个问题同样影响到getTime()方法。理解这些细节对于精确的日期时间操作至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前一直记得getTime()和Date.parse()方法都是返回某个时间到1970年1月1日0:00的毫秒数,但是这次遇到了问题。
当我使用Date.parser()的时候,返回的却是这个时间点到1970年1月1日08:00的毫秒数。下面是我的代码:

function startTime() {
    let date = new Date,
        year = date.getFullYear(),
        month = date.getMonth() + 1,
        day = date.getDate();
    return Date.parse(year + '-' + month + '-' + day) ;
}

原来当年月日中间用’-‘的符号的时候,它的解析是用UTC 时区处理,而不是用本地时区处理的,因此和格林尼治恰好差8小时,就成了这个时间点到1970年1月1日08:00的毫秒数。
解决的方法是中间用其他符号,如‘/’。
然后getTime()也会有一样的问题。

### JavaScript中的`Date.parse()``new Date` #### `Date.parse()` `Date.parse()` 函数用于解析一个包含日期的字符串,并返回该日期与 1970 年 1 月 1 日 UTC 时间零点之间的毫秒差值[^2]。 对于不同的浏览器环境,`Date.parse()` 对某些特定格式的支持可能有所不同。例如,在 Android 浏览器环境中可以成功解析 "YYYY-MM-DD HH:mm:ss" 这样的时间格式;但在 iOS 的 Safari 上则无法正常工作[^4]。 因此建议开发者们尽量采用广泛兼容的标准 ISO8601 或 RFC2822 格式的日期表达方式来确保跨平台的一致性可靠性。 ```javascript // 正确使用ISO8601标准的时间格式 const timestamp = Date.parse('2023-10-05T14:48:00Z'); console.log(timestamp); // 输出对应的Unix时间戳(以毫秒计) ``` #### 使用 `new Date()` 创建一个新的 `Date` 实例可以通过多种方式进行初始化: - 不带参数:当前本地时间为默认值; - 字符串形式:传入符合上述提到过的标准化格式之一作为构造函数输入; - 数字型 Unix Time Stamp (单位为ms): 表示自纪元起经过了多少毫秒。 当利用带有具体时区信息的完整时间表示法构建对象实例时,所得到的结果会自动转换成本地计算机设置下的相应时刻显示出来。 ```javascript // 创建基于给定时间字符串的新Date对象 let dateInstance = new Date('October 5, 2023 11:13:00'); // 打印出完整的日期时间其内部存储的形式即UTC时间戳 console.log(dateInstance.toString()); // 显示为人读取友好的全貌视图 console.log(dateInstance.valueOf()); // 获取到的是从UNIX Epoch开始计算至此刻经历过的总毫秒数 // 如果想要获取某一部分的具体数值比如年份可以用getFullYear() console.log(dateInstance.getFullYear()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值