JavaScript Date如何获取公元1年?规避年份映射方案问询
如何在JavaScript中创建实际的公元1年日期,规避0-99年份映射到1900-1999的问题
问题背景
在JavaScript中,执行new Date(1, 0, 1)会返回1901年而非公元1年,原因是JS引擎会自动将099的年份映射为19001999年。在React项目中处理datetime-local字段时,用户输入初期可能会输入类似公元1年的短年份,此时需要避免这种自动映射,得到实际的目标年份。
解决方案
要创建实际的公元1年(或其他0-99范围内的非20世纪年份),可以通过以下两种方式规避默认映射:
1. 使用Date.UTC()构造日期
Date.UTC()方法接受四位数年份时不会触发自动映射逻辑,直接传入目标年份后,将返回的时间戳传给Date构造函数即可:
// 创建公元1年1月1日的UTC日期 const year1Date = new Date(Date.UTC(1, 0, 1)); console.log(year1Date); // 输出根据时区不同会有差异,例如:Wed Jan 01 0001 08:00:00 GMT+0800 (中国标准时间)
2. 传入完整的ISO格式日期字符串
直接传入包含四位数年份的ISO日期字符串,JS会正确解析为对应年份,不会触发映射:
// 创建公元1年1月1日的日期 const year1Date = new Date('0001-01-01'); console.log(year1Date); // 输出对应时区的公元1年日期
React项目中的实时输入处理方案
针对datetime-local字段每次按键触发onChange的场景,可以在处理输入值时手动判断年份长度,对短年份做特殊处理:
import { useState } from 'react'; function DateInput() { const [selectedDate, setSelectedDate] = useState(null); const handleDateChange = (e) => { const inputValue = e.target.value; if (!inputValue) { setSelectedDate(null); return; } // 拆分datetime-local的输入格式(YYYY-MM-DDTHH:mm) const [datePart] = inputValue.split('T'); const [yearPart, monthPart, dayPart] = datePart.split('-'); const year = parseInt(yearPart, 10); if (year >= 1 && year <= 99) { // 处理短年份:用Date.UTC构造正确日期 const adjustedDate = new Date(Date.UTC( year, parseInt(monthPart, 10) - 1, // 月份参数从0开始(1月对应0) parseInt(dayPart, 10) )); setSelectedDate(adjustedDate); } else { // 正常处理四位数年份 setSelectedDate(new Date(inputValue)); } }; return ( <input type="datetime-local" onChange={handleDateChange} value={selectedDate ? selectedDate.toISOString().slice(0, 16) : ''} /> ); } export default DateInput;
注意事项
- 主流现代浏览器(Chrome、Firefox、Edge)均支持正确解析公元1年这类极早日期,但部分旧浏览器可能存在兼容性问题。
- 使用
Date.UTC()时,月份参数需遵循从0开始的规则,与Date构造函数的要求一致。
内容的提问来源于stack exchange,提问作者DarkTrick
相关产品推荐
相关产品推荐

