You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何new Date("2018-01-01").getFullYear()返回2017?

为什么new Date("2018-01-01").getFullYear()返回2017?

嗨,这其实是JavaScript处理日期时区时的一个经典“坑”,我来给你掰明白:

首先,当你用不带时区信息的ISO 8601格式字符串(比如"2018-01-01")创建Date对象时,JavaScript会默认把这个时间解析成UTC时区的时间——也就是你看到的2018-01-01T00:00:00.000Z(末尾的Z就是UTC的标志)。

但问题出在getFullYear()这个方法上:它是基于你的本地时区来返回年份的。举个实际例子,如果你在UTC+8时区(比如中国内地、新加坡这些地区),UTC的2018年1月1日零点,换算成本地时间其实是2017年12月31日的下午4点(因为UTC+8比UTC快8小时,所以UTC时间往前推8小时就是你的本地时间)。这时候调用getFullYear(),自然会拿到2017而不是你预期的2018。

解决办法有两个:

  • 如果你想基于UTC时间获取年份,用getUTCFullYear()方法:new Date("2018-01-01").getUTCFullYear() 会准确返回2018。
  • 如果你希望字符串按照本地时区解析,可以换一种日期创建方式:比如new Date(2018, 0, 1)(注意JS里月份是从0开始的,1月对应0),或者把字符串改成带本地时区的格式,这样创建的日期就是本地时区的2018年1月1日零点,调用getFullYear()就会返回2018了。

内容的提问来源于stack exchange,提问作者FutoRicky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:31:08