javascript如何操作日期和时间_有哪些常用库?

发布时间 - 2026-01-05 00:00:00    点击率:
原生 Date 有设计缺陷,推荐用 date-fns(轻量、纯函数)或 dayjs(Moment 替代,仅 2KB);Moment.js 已不建议新项目使用。

JavaScript 原生 Date象够用,但写法繁琐、易出错;生产项目推荐用 date-fns(轻量、函数式)或 dayjs(API 类似 Moment,体积小),Moment.js 已不建议新项目使用。

原生 Date 的坑怎么绕开?

原生 Date 构造行为不一致、时区处理反直觉、月份从 0 开始、getMonth()getDay() 容易混淆——这些不是“用法问题”,是设计缺陷。

  • new Date('2025-10-01') 在 Safari 和部分安卓 WebView 中解析为 UTC 时间,而在 Chrome 中可能按本地时区解析;统一改用 new Date(2025, 9, 1)(注意:月份是 0–11)
  • 格式化必须手写拼接,比如 ${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}
  • 计算“7 天后”不能直接 d.setDate(d.getDate() + 7),因为会修改原对象且跨月时逻辑脆弱;应先克隆:const next = new Date(d); next.setDate(d.getDate() + 7);

date-fns 为什么适合大多数场景?

它按需引入、无副作用、类型友好(自带 TypeScript 支持),所有函数都是纯函数,不会修改原始 Date 对象。

  • 安装:npm install date-fns
  • 常用操作示例(ESM 方式导入):
import { addDays, format, parseISO, isAfter, differenceInCalendarDays } from 'date-fns';

const d = parseISO('2025-10-01'); const tomorrow = addDays(d, 1); console.log(format(tomorrow, 'yyyy-MM-dd')); // '2025-10-02' console.log(differenceInCalendarDays(new Date(), d)); // 距离今天多少整天

  • 注意:不要 import 整个包(import * as dateFns from 'date-fns'),否则会打包全部函数,体积暴增
  • 时区相关操作(如转 UTC、显示用户本地时间)需配合 date-fns-tz 插件

dayjsMoment.js 怎么选?

dayjs 是 Moment 的轻量替代,API 高度兼容,压缩后仅 2KB;Moment.js 已进入维护模式,官方明确建议迁移到 dayjsdate-fns

  • dayjs 默认不带插件,如需相对时间(fromNow)、时区支持,要显式引入:import 'dayjs/plugin/relativeTime'; dayjs.extend(relativeTime);
  • Moment.jsmoment().add(1, 'days') 看似简洁,但内部 mutates 原对象,且包体积超 300KB,Tree-shaking 无效
  • 若项目已重度依赖 Moment,可先用 moment-timezone + moment,但新功能开发请避免再加 Moment 代码

真正难的不是“选哪个库”,而是统一团队对时区的处理策略:后端传的时间戳是否含时区?前端展示要不要转成本地时间?日历组件选中日期要不要归零时分秒?这些比函数调用更影响稳定性。


# javascript  # java  # js  # 前端  # typescript  # npm  # 安卓  # safari  # 后端  # yy  # 为什么 


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


相关推荐: 成都网站制作公司哪家好,四川省职工服务网是做什么用?  bootstrap日历插件datetimepicker使用方法  高端网站建设与定制开发一站式解决方案 中企动力  详解jQuery中的事件  深圳网站制作平台,深圳市做网站好的公司有哪些?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  郑州企业网站制作公司,郑州招聘网站有哪些?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  HTML 中动态设置元素 name 属性的正确语法详解  制作电商网页,电商供应链怎么做?  Laravel如何创建自定义Artisan命令?(代码示例)  如何用y主机助手快速搭建网站?  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  ,在苏州找工作,上哪个网站比较好?  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Java类加载基本过程详细介绍  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  如何用PHP快速搭建高效网站?分步指南  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel如何使用Blade组件和插槽?(Component代码示例)  如何在新浪SAE免费搭建个人博客?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何在IIS管理器中快速创建并配置网站?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  linux top下的 minerd 木马清除方法  javascript中闭包概念与用法深入理解  浅谈javascript alert和confirm的美化  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  如何在IIS中新建站点并配置端口与IP地址?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Laravel如何配置Horizon来管理队列?(安装和使用)  js实现获取鼠标当前的位置  如何用虚拟主机快速搭建网站?详细步骤解析  历史网站制作软件,华为如何找回被删除的网站?  JavaScript如何实现路由_前端路由原理是什么  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何快速搭建高效可靠的建站解决方案?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  Laravel如何优化应用性能?(缓存和优化命令)