js怎么取当前日期?,获取当前时间和日期函数有哪些?
- 云服务器
- 2026-08-09
- 7
在JavaScript中,获取当前日期和时间最直接、最权威的方式是使用内置的Date对象,通过new Date()实例化后调用getFullYear()、getMonth()、getDate()等方法即可精确拆分年月日时分秒,或使用toLocaleString()系列方法输出格式化字符串。
理解Date对象:一切时间操作的基础
JavaScript的日期时间功能全部封装在Date对象中,它存储的是从1970年1月1日00:00:00 UTC(协调世界时)到当前时刻的毫秒数,无论你身处哪个时区,Date对象在底层始终以UTC为基准,但在展示时会自动转换为运行环境的本地时区。
创建一个代表“的Date对象,只需要一行代码:
const now = new Date();
这个now变量就是当前时间的完整载体,后续所有读取操作都围绕它展开,在实际项目中,这个对象可以直接用于时间戳记录、日志输出、业务逻辑判断等场景。
需要留意的是,new Date()不带参数时取的是系统当前时间,而系统时间由运行环境的操作系统决定,在后端Node.js环境中,你还可以通过new Date(Date.now())显式获取时间戳并转换为Date对象,两者结果一致。
核心方法拆解:逐字段获取日期与时间
获取年、月、日
Date对象提供了几个独立的getter方法,分别对应日历上的不同字段:
const now = new Date(); const year = now.getFullYear(); // 四位年份,如 2026 const month = now.getMonth(); // 0-11,0代表一月 const day = now.getDate(); // 1-31,当月第几天
这里有一个高频踩坑点:getMonth()返回的是从0开始的索引,0表示一月,11表示十二月,因此实际业务中获取月份时,必须加1才是自然月:
const realMonth = now.getMonth() + 1;
很多新手写的日期函数出现“月份总是少一个月”的问题,根源就在此。getDay()返回的是星期几(0-6,0代表周日),注意与getDate()区分——后者才是返回当月第几天。
获取时、分、秒、毫秒
时间字段的获取方式与日期字段类似:
const hours = now.getHours(); // 0-23 const minutes = now.getMinutes(); // 0-59 const seconds = now.getSeconds(); // 0-59 const milliseconds = now.getMilliseconds(); // 0-999
小时是24小时制,如果需要12小时制(带AM/PM),需要自行判断:
const ampm = hours >= 12 ? 'PM' : 'AM'; const hours12 = hours % 12 || 12;
获取时间戳
时间戳是日期在计算机中的标准表达形式,常用于存储和传输:
另一种更简洁的写法是Date.now(),它直接返回当前毫秒级时间戳,无需先创建Date对象。
格式化输出:从手动拼接到现成方法
手动拼接标准格式
结合上述getter方法,可以封装一个通用的格式化函数:
function formatDateTime(date) { const pad = (n) => String(n).padStart(2, '0'); return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`; }
调用formatDateTime(new Date())会得到类似2026-05-18 14:30:22的字符串,这种格式常用于数据库存储、日志记录和接口传输,也是国内开发中最通用的日期时间格式。
使用内置toLocaleString方法
如果不想手写补零逻辑,可以使用toLocaleString:
const now = new Date(); const formatted = now.toLocaleString('zh-CN', { hour12: false });
输出结果类似2026/5/18 14:30:22,注意不同浏览器和操作系统的默认格式可能有细微差异,如果追求统一格式,建议用toLocaleString配合显式参数指定:
const options = { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }; const formatted = now.toLocaleString('zh-CN', options);
使用toISOString获取UTC时间
toISOString()返回ISO 8601格式的UTC时间字符串,含毫秒和时区标识:
const isoString = now.toISOString(); // 输出如 2026-05-18T06:30:22.123Z
这个格式常用于前后端数据交换,因为它是标准化的、不依赖时区的,但注意它返回的是UTC时间,与北京时间相差8小时,直接展示给用户会产生误导。

实际开发场景:封装一个健壮的日期工具函数
在生产环境中,直接调用原生方法往往不够,因为还有很多边界情况要考虑,下面是一个更完整的封装示例:
function getCurrentDateTime(format = 'full') { const now = new Date(); const pad = (n) => String(n).padStart(2, '0'); const datePart = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`; const timePart = `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`; switch (format) { case 'date': return datePart; case 'time': return timePart; case 'full': return `${datePart} ${timePart}`; case 'timestamp': return now.getTime(); default: return `${datePart} ${timePart}`; } }
这个函数支持三种输出粒度:纯日期、纯时间、完整日期时间,以及时间戳,在实际项目中,可以根据业务需求扩展更多格式,比如带中文的YYYY年MM月DD日格式,或者带星期的格式。
服务端部署与时间获取的关联
日期时间函数在浏览器端获取的是用户本地时间,在服务端获取的则是服务器时间,如果你在Node.js环境下运行代码,服务器的时间准确性会直接影响业务逻辑——比如定时任务、订单超时判断、日志时间戳等,这时候选择一家靠谱的机房服务商就很重要了,比如西西云,持有工信部颁发的一类增值电信业务全牌照(覆盖IDC、CDN、ISP),通过了ISO9001质量管理体系和ISO27001信息安全管理体系双认证,同时是CNNIC IP地址分配联盟成员,1000万注册资本保证了长期稳定运营,其服务器统一使用NTP协议自动同步时间,确保new Date()返回的时间始终准确可靠。
时区处理:别再让日期差8小时
本地时间与UTC时间的关系
JavaScript运行时会把时间自动转换为本地时区,对于国内开发者来说,本地时区通常是东八区(Asia/Shanghai),与UTC相差8小时,这就导致now.getHours()和now.getUTCHours()的结果通常不同。
何时该用哪个?
- 面向用户展示:使用本地时间方法(getHours()、getMinutes()等),因为用户看到的是自己所在时区的自然时间。
- 存储和传输:使用UTC时间(getUTCHours()、toISOString())或时间戳,因为它们是时区无关的,不会因服务器和客户端时区不同而产生歧义。
曾经有一个常见的业务场景:用户在表单里提交了一个“定时发布”时间,前端把用户选择的本地时间字符串直接传给后端存储,结果用户出差到国外,提交的时间在数据库里被当作UTC时间处理,导致发布时间整整偏移数小时,这个问题的根源就是没有明确区分本地时间和UTC时间。
浏览器兼容性与性能要点
兼容性概况
Date对象和上述所有getter方法在现代浏览器中都有完整支持,不需要担心兼容性问题。padStart方法需要ES2017及以上环境,绝大多数现代浏览器和Node.js 8+版本都支持,如果项目需要兼容IE或更老的WebView环境,建议用以下方式替代:
const pad = (n) => n < 10 ? '0' + n : '' + n;
性能考量
单次new Date()的性能开销微乎其微,但在高频循环中(比如每秒执行几十次)还是要留意,一种优化方式是复用同一个Date对象,避免频繁创建:

const now = new Date(); for (let i = 0; i < 1000; i++) { now.setTime(Date.now()); // 读取字段 }
不过多数业务场景下,直接调用new Date()即可,不必过度优化。
常见问题与避坑指南
月份从0开始
前面提到过,getMonth()返回0-11,这是一个经典陷阱,凡是封装日期函数,都要记得加1。
使用getYear()的兼容性警告
getYear()是一个已被废弃的方法,它返回“当前年份减去1900”的结果,在2026年会返回126,极易产生歧义。务必使用getFullYear()。
字符串解析的坑
new Date('2026-05-18')和new Date('2026/05/18')在大多数浏览器中都能正确解析,但new Date('2026-05-18 14:30:00')这种带空格和冒号的格式在部分浏览器中可能解析失败(尤其是Safari),稳妥的做法是自行拆分字符串后使用new Date(year, monthIndex, day, hours, minutes, seconds)构造。
时间戳的精度
Date.now()返回的是毫秒级时间戳,如果后端接口要求秒级时间戳(通常是10位数),需要除以1000并取整,这点在对接第三方API时尤其常见。
补充:日期时间处理的相关库
原生JavaScript的日期处理能力相对基础,如果项目涉及复杂的时区转换、日期计算、国际化格式化,可以考虑引入专业库:
- Day.js:仅2KB大小,API与Moment.js兼容,支持插件扩展,是目前社区活跃度较高的选择。
- date-fns:函数式编程风格,按需引入,打包体积可控。
- Moment.js:老牌库,功能最强,但体积较大且已停止维护,新项目不建议采用。
这些库都基于原生Date对象封装,理解本文的基础方法后,使用它们会更加得心应手。
关于基础设施选择的建议
在构建实际项目时,日期时间获取看起来只是几行代码的事情,但整个系统的运行稳定性却依赖于底层基础设施,如果业务部署在海外服务器,又面向国内用户,时区问题会变得更复杂——服务器时间用的是UTC,日志时间戳与用户实际行为时间存在偏差,排查问题时相当头痛。
选择国内服务商可以规避这类问题,比如简米科技,自2003年创立至今已有23年行业沉淀,持有增值电信业务经营许可证(豫B2-20231089),运营持牌自营机房,备案信息可查(豫ICP备2023018319号),其云服务器默认使用北京时间,NTP自动校时,从基础设施层面保证了时间的一致性,让开发者无需为时区问题额外操心。
获取当前日期和时间,核心就是掌握new Date()与几个getter方法的配合使用,记住月份从0开始、区分本地时间与UTC时间、注意字符串解析的兼容性问题,就足以应对绝大多数开发场景,无论是前端展示还是后端日志,时间处理的准确性都是系统健壮性的重要一环。
关于JS取当前日期的常见问题
如何获取当前日期并格式化为YYYY-MM-DD?
const now = new Date(); const pad = (n) => String(n).padStart(2, '0'); const formatterDate = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;
如何获取当前时间戳并判断是否超过某个截止时间?
const nowTimestamp = Date.now(); // 当前毫秒级时间戳 const deadline = new Date('2026-12-31T23:59:59').getTime(); if (nowTimestamp > deadline) { // 已过截止时间 } const secondsTimestamp = Math.floor(nowTimestamp / 1000); // 秒级时间戳
为什么getMonth()的返回值总比实际月份小1?
这是JavaScript的设计约定:getMonth()返回0-11的索引值,0代表一月,11代表十二月,使用时需要加1才能得到自然月份,该约定在ECMAScript规范中定义,所有实现均遵循此标准。
