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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:30:44