如何操作日期javascript_Date对象有哪些常用方法【教程】

发布时间 - 2026-01-30 00:00:00    点击率:
Date对象本质是带时区的时间戳快照,所有方法操作毫秒数;new Date('2025-10-01')因UTC解析致本地显示偏差,需用'2025-10-01T00:00:00'或new Date(2025,9,1)避免歧义。

JavaScript 的 Date 对象不是“操作日期的工具箱”,而是带时区的**时间戳快照**——所有方法本质都是对毫秒数的读写,理解这点才能避开多数坑。

为什么 new Date('2025-10-01') 在某些浏览器返回前一天?

因为 '2025-10-01' 被解析为 UTC 时间,再转成本地时区显示。中国用户看到 Sun Oct 01 2025 08:00:00 GMT+0800 是正常的,但如果你期望它代表“本地 10 月 1 日零点”,就得显式补全时间部分:

  • new Date('2025-10-01T00:00:00') —— 强制按本地时区解析(ISO 格式带 T)
  • new Date(2025, 9, 1) —— 构造函数参数中月份是 0 起始,9 才是十月
  • 避免用 new Date('2025/10/01'):斜杠格式在 Safari 中可能被当作本地时间,Chrome 当 UTC,行为不一致

getMonth()、getDate() 和 getUTCDate() 到底该用哪个?

取决于你要表达的语义:

  • getDate() 返回本地时区“今天几号”,比如 UTC 时间是 9 月 30 日 18:00,中国用户调用会得 1(10 月 1 日)
  • getUTCDate() 返回 UTC 时间的“几号”,同一时刻永远返回 30
  • getMonth() 永远返回 0–11,别直接当月份用;显示时记得 +1
  • 跨时区计算(如“用户所在地区本月第几天”)必须用 getDate() 系列;做服务器时间比对或日志归档用 getUTCxxx() 系列

setDate() 修改日期后,为什么小时变了?

因为 setDate() 只改“日”,其他字段(时分秒毫秒)保持不变。如果原时间是 new Date('2025-01-31T15:00:00'),执行 date.setDate(32) 后变成 2 月 1 日 15:00:00 —— 看似合理,但如果原时间是 2025-01-31T23:00:00,加一天会进到 2 月 1 日 23:00:00,但若你本意是“加 24 小时”,更安全的做法是:

  • date.setTime(date.getTime() + 24 * 60 * 60 * 1000) —— 显式加毫秒,不依赖日历逻辑
  • date.setDate(date.getDate() + 1) 前先确认是否需要保留原始时分秒;否则建议用 date.setHours(0, 0, 0, 0) 归零再操作
  • 注意:setMonth() 会自动处理天数溢出(比如 1 月 31 日设成 2 月 → 变成 3 月 3 日),这是隐式行为,容易误判

toJSON()、toISOString() 和 toString() 输出差异在哪?

三者都返回字符串,但语义和用途完全不同:

  • date.toJSON() 等价于 date.toISOString(),输出 "2025-10-01T00:00:00.000Z",用于 API 通信或 JSON 序列化
  • date.toString() 返回本地时区可读字符串,如 "Sun Oct 01 2025 08:00:00 GMT+0800 (China Standard Time)",适合调试打印
  • date.toLocaleString() 会根据系统语言和地区格式化,但结果不可控,不适合存储或传输
  • 警惕:JSON.stringify(new Date()) 内部会调用 toJSON

    ()
    ,所以序列化后是 ISO 字符串,不是 Date 对象

最常被忽略的是:所有 Date 方法都受本地时区影响,没有“绝对日期”这种东西;传给后端的时间,要么统一用 UTC 字符串(toISOString()),要么明确约定时区偏移(date.getTimezoneOffset() 返回分钟数,注意是反向的)。


# javascript  # java  # js  # json  # 浏览器  # 工具  # safari  # 后端  # 为什么  # chrome  # 构造函数  # date  # 字符串  # 对象  # 中国  # 的是  # 都是  # 几号  # 这是  # 如果你  # 序列化  # 才是  # 你要  # 几天 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在宝塔面板创建新站点?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  图册素材网站设计制作软件,图册的导出方式有几种?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  如何在搬瓦工VPS快速搭建网站?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  jQuery validate插件功能与用法详解  长沙企业网站制作哪家好,长沙水业集团官方网站?  Linux网络带宽限制_tc配置实践解析【教程】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  如何确保西部建站助手FTP传输的安全性?  如何在七牛云存储上搭建网站并设置自定义域名?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  如何快速查询网站的真实建站时间?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  详解CentOS6.5 安装 MySQL5.1.71的方法  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  动图在线制作网站有哪些,滑动动图图集怎么做?  如何在腾讯云服务器快速搭建个人网站?  MySQL查询结果复制到新表的方法(更新、插入)  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Laravel如何使用.env文件管理环境变量?(最佳实践)  网页设计与网站制作内容,怎样注册网站?  Laravel Fortify是什么,和Jetstream有什么关系  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  免费视频制作网站,更新又快又好的免费电影网站?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  使用C语言编写圣诞表白程序  如何在局域网内绑定自建网站域名?  微信公众帐号开发教程之图文消息全攻略  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环