ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Rails 中用 `advance` 方法推进日期:向前与向后调整 Date 的最简方式

Rails 中用 `advance` 方法推进日期:向前与向后调整 Date 的最简方式 文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载在 Rails 应用中处理日期加减是日常开发的高频操作计算订阅到期日、安排任务触发时间、推算报表周期……Ruby 原生的Date只提供/-天数的能力而 ActiveSupport 为Date、Time与DateTime追加了语义化的#advance方法让你可以用days、months、weeks等人类可读的单位向前或向后推进日期。本文以 rails/advance-the-date.md 为核心结合本仓库中其他 Rails 时间处理笔记完整讲解#advance的用法、单位组合与边界行为读完即可在模型、任务调度和查询中直接上手。#advance是什么#advance是 ActiveSupport 为日期与时间对象提供的实例方法它接收一组以时间单位为键的选项返回推进后的新对象而不会修改原对象。它不属于 Ruby 标准库因此只在 Rails 或显式require active_support的环境中可用。在本仓库的 rails 分类 下所有日期时间相关的笔记都默认在 Rails 控制台中演示这也是#advance最常见的验证场所。向前推进日期最直观的用法是传入正数让日期向后未来移动。原文档在 Rails 控制台中的演示如下 Date.today Wed, 31 Aug 2016 Date.today.advance(days: 1) Thu, 01 Sep 2016 Date.today.advance(months: 1) Fri, 30 Sep 2016这里有两个值得注意的细节advance(days: 1)从 8 月 31 日推进一天得到 9 月 1 日跨月自然衔接无需手动处理月份进位。advance(months: 1)从 8 月 31 日推进一个月得到9 月 30 日而非 9 月 31 日——因为 9 月没有 31 日ActiveSupport 会把结果自动夹取到该月的最后一天。这种月末自动校正是#advance在按月推进时的重要边界行为使用前应有预期。除了示例中的days与monthsActiveSupport 的#advance还支持weeks与years键。例如Date.today.advance(weeks: 2)会推进整整 14 天Date.today.advance(years: 1)则推进到明年同日。向后推进日期负数同样有效#advance接受负数因此一个方法同时覆盖推前与回退两种需求不需要记忆days_ago、months_ago等一整套对称方法名。原文档演示 Date.today.advance(months: -2) Thu, 30 Jun 2016从 8 月 31 日回退两个月得到 6 月 30 日同样是月末夹取规则在回退方向的体现若按每月的同一天机械计算应得 6 月 31 日而 6 月只有 30 天。所有单位键都可以这样取负值例如advance(days: -7)回退一周。同时组合多个单位#advance的选项可以一次传入多个键按单位粒度统一计算。例如 Date.today.advance(years: 1, months: 2, days: 3) Mon, 03 Dec 2018 # 以 2016-08-31 为基准的推算结果多个单位会依years → months → weeks → days的顺序依次作用期间每步都可能触发上文的月末夹取因此组合推进时结果可能与先算年、再算月、最后加天数的直觉略有出入建议在关键业务逻辑上补充测试用例确认。与其他 Rails 时间工具的搭配#advance常常与其他 ActiveSupport 时间工具组合使用本仓库就有多处印证与 Duration 常量搭配在 rails/useful-active-support-constants-for-durations.md 中可以看到ActiveSupport::Duration提供的语义化扩展如1.day、3.hours。当你需要把天数这样的时长换算后传给#advance之外的接口时可以借助这些常量保持代码自解释。与区间端点搭配#advance返回的仍是一个日期对象可以直接参与比较与区间运算。例如调度任务时可结合end_of_week等计算型方法——本仓库 rails/schedule-sidekiq-jobs-out-into-the-future.md 就展示了MyWorker.perform_at(Date.today.end_of_week, arg1, arg2)这样的用法你同样可以把Date.today.advance(days: 3)作为perform_at的执行时刻传入。与Time.current搭配若需要推进到某个精确时刻含时分秒可在Time对象上调用#advance如Time.current.advance(hours: 3, minutes: 30)。关于为什么用Time.current而不是Time.now以保证时区正确见 rails/get-the-current-time.md若想进一步调整DateTime的时区偏移可参考 rails/change-the-time-zone-offset-of-a-datetime-object.md。使用建议#advance是非破坏性方法返回值需要赋值或链式使用原对象保持不变。涉及月末闰年 2 月等场景如从 1 月 31 日推进一个月时先确认月末夹取是否符合业务语义若业务要求严格加一个月后取同一天需要自行处理边界。在 Rails 控制台中随手验证是最快的上手方式仓库内所有笔记示例均以控制台输出呈现确认结果后再落进模型回调、Job 或查询条件。综上#advance用一套统一的键值语法同时解决了日期前推、回退与多单位组合的问题配合本仓库 rails 分类下的其他时间处理笔记可以覆盖绝大多数 Rails 日期运算需求。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐如何三步实现微信聊天记录永久备份开源工具完整指南如何三步实现微信聊天记录永久备份开源工具完整指南 你是否曾担心珍贵的微信对话会随着手机更换而永远消失那些与家人的温馨对话、重要的工作沟通、难忘的生活片段是终极Apache Fury模式兼容性指南前向和后向兼容的完整解决方案终极Apache Fury模式兼容性指南前向和后向兼容的完整解决方案 Apache Fury是一个由JIT和零拷贝技术驱动的多语言序列化框架它提供了强大的模基础架构开发工具date-fns终极指南面向新手的JavaScript日期处理完整教程date fns终极指南面向新手的JavaScript日期处理完整教程 date fns是一个现代JavaScript日期工具库提供了丰富的日期处理功能帮前端后端上一篇rye list 命令详解一键查看项目已安装依赖清单下一篇猫抓浏览器资源嗅探工具极速指南免费开源三步下载任意网页视频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表