代码之家  ›  专栏  ›  技术社区  ›  Olly

给定一个日期,如何高效地按给定的顺序(每周、每月、每年)计算下一个日期?

  •  2
  • Olly  · 技术社区  · 16 年前

    未来 顺序中的日期。

    def calculate_next_date(from_date)
      next_date = from_date
      while next_date < Date.today
        next_date += 1.week # (or 1.month)
      end
      next_date
    end
    

    我不想执行循环(虽然很简单,但效率很低,特别是在给定一个遥远的过去的日期时),而是想通过计算两个日期之间的周数(或月数、年数),计算余数,并使用这些值生成下一个日期的日期算术来完成。

    这是正确的方法,还是我遗漏了一个特别聪明的“Ruby”方法来解决这个问题?或者为了简单起见,我应该坚持循环吗?

    3 回复  |  直到 16 年前
        1
  •  15
  •   thumbtackthief    8 年前

    因为你把这个问题标记为 ruby-on-rails ,我想您正在使用Rails。 calculation 提供帮助的模块 #advance 方法。

    date = Date.today
    date.advance(:weeks => 1)
    date.advance(:days => 7)
    # => next week
    
        2
  •  4
  •   anshul    16 年前

    我用过 recurrence gem 为了这个目的。还有一些其他的宝石可以模拟重复出现的事件 here .

        3
  •  2
  •   bta    16 年前

    如果你在使用 Time 对象,可以使用 Time.to_a 要将时间分成一个数组(包含表示小时、天、月等的字段),请调整相应的字段,并将数组传递回 Time.local Time.utc 建立一个新的 时间 反对。

    Date 班级, date +/- n 会在n天后/之前给你一个日期,并且 date >>/<< n 会在n个月后/之前给你一个日期。

    你可以用更通用的 Date.step 而不是你的循环。例如,

    from_date.step(Date.today, interval) {|d|
        # Each iteration of this block will be passed a value for 'd'
        #   that is 'interval' days after the previous 'd'.
    }
    

    哪里 interval 是以天为单位的时间长度。

    日期 目标,做 date - Date.today

    # Parameter 'old_date' must be a Date object
    def months_since(old_date)
        (Date.today.month + (12 * Date.today.year)) - (old_date.month + (12 * old_date.year))
    end
    def years_since(old_date)
        Date.today.year - old_date.year
    end
    def days_since(old_date)
        Date.today - old_date
    end
    
    推荐文章