尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

effect-smol DateTime模块:彻底告别new Date的坑

effect-smol DateTime模块:彻底告别new Date的坑 effect-smol DateTime模块彻底告别new Date的坑【免费下载链接】effect-smolCore libraries and experimental work for Effect v4项目地址: https://gitcode.com/GitHub_Trending/ef/effect-smol在 effect-smolEffect v4 核心库仓库中DateTime模块为 JavaScript/TypeScript 提供了安全解析、时区感知、可测试、不可变的日期时间方案帮你彻底告别new Date带来的解析陷阱与时区混乱。它直接来自 DateTime.ts内部实现见 internal/dateTime.ts。为什么 new Date 总是踩坑使用原生Date时你大概率遇到过这些问题坑表现 解析不一致new Date(2024-06-15)在 UTC 与本地时区下行为不同甚至不同浏览器结果都不一样 时区混乱同一时刻在不同时区显示不同钟面时间转换全靠手算 无法测试测试里时间不可控涉及今天/明天的逻辑时断时断 可变对象setHours等方法原地修改数据悄悄被改掉effect-smol DateTime 模块的 5 个核心能力DateTime用一个绝对时刻epoch 毫秒 可选时区的模型统一了这些问题安全解析DateTime.make接受字符串、时间戳、Date等多种输入解析失败返回Option而不是静默产出错误值可测试的当前时间DateTime.now走 Effect 的Clock服务测试时可用 TestClock 精确控制现在是几点时区感知基于 IANA 时区如Pacific/Auckland做钟面显示与转换并支持CurrentTimeZone服务注入当前用户时区不可变日历运算add/subtract/startOf/endOf/nearest等运算总是返回新值原值永不被修改稳定格式化formatIso、formatLocal、formatUtc等一组格式化函数输出稳定、可控。相关 API 全部定义在 DateTime.ts 中测试用例可参考 DateTime.test.ts。快速上手从获取当前时间到跨时区显示官方示例文档 10_creating-and-formatting.ts 展示了典型用法核心只有几行const now yield* DateTime.now // 可测试的当前时间 const endsAt now.pipe(DateTime.add({ hours: 2 })) // 不可变运算 DateTime.formatIso(endsAt) // 稳定的 ISO 输出时区部分见 20_time-zones.tsconst nowInAuckland now.pipe(DateTime.setZoneNamedUnsafe(Pacific/Auckland)) const nowInNewYork yield* DateTime.nowInCurrentZone // 由 CurrentTimeZone 服务提供 项目内部约定Effect 程序里请用DateTime模块不要直接使用Date和Date.now()详见 07_datetime/index.md。新旧用法对照迁移只需换几个 API原生写法effect-smol DateTime 写法好处new Date(str)DateTime.make(str)失败时显式得到None不再静默出错Date.now()yield* DateTime.now测试中可冻结/拨动时间new Date(t 2 * 3600_000)t.pipe(DateTime.add({ hours: 2 }))不可变、语义清晰toLocaleString(...)formatLocal/formatUtc输出稳定时区明确手算 UTC 偏移setZoneNamed IANA 时区自动处理夏令时与历史变更文件导航核心模块DateTime.ts内部实现internal/dateTime.ts测试时间服务testing/TestClock.ts使用教程ai-docs/src/07_datetime/模块测试test/DateTime.test.ts总结如果你受够了new Date的解析玄学、时区陷阱和不可测试性effect-smol 的DateTime模块给出了工程化答案安全解析 可测试时钟 IANA 时区 不可变运算。迁移成本很低——把new Date换成DateTime.make把Date.now()换成DateTime.now剩下的坑就基本与你无关了 ✅【免费下载链接】effect-smolCore libraries and experimental work for Effect v4项目地址: https://gitcode.com/GitHub_Trending/ef/effect-smol创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表