【问题标题】:In Rails, can't I use .next_week with -.hours?在 Rails 中,我不能将 .next_week 与 -.hours 一起使用吗?
【发布时间】:2015-07-31 12:22:38
【问题描述】:

我需要使用.next_week 而不是+1.week。因为.next_week 将下周和周一的日期设置在同一时间。太舒服了。然后我减去几个小时。但什么都没有改变。这是我的代码。

newDate = DateTime.now
newDate = newDate.next_week - 3.hours
=> Sun, 30 Aug 2015 21:00:00 +0900
newDate = newDate.next_week - 3.hours
=> Sun, 30 Aug 2015 21:00:00 +0900
newDate = newDate.next_week - 3.hours
=> Sun, 30 Aug 2015 21:00:00 +0900

为什么不能同时使用它们?请给我解释一下。谢谢。

【问题讨论】:

  • 请说明您的期望
  • 您通过减去小时数来回滚一周,因此下周仍是下周一。例如#next_week #=> monday - 3.hours #=> sunday #next_week (Same Monday) 它只是在创建一个循环。
  • +1.week 明显添加 1 周的日期。但是.next_week 下周和周一。我觉得很舒服。我不应该使用它。但我只是好奇为什么日期没有改变。
  • newDate.next_week 每次都返回相同的内容,然后从中减去三个小时以回到开始的位置。

标签: ruby-on-rails ruby datetime ruby-on-rails-4


【解决方案1】:

这与#next_week 和- 3.hours 同时工作无关。这是对#next_week 工作原理的误解。

#next_week 假定默认情况下一周是周一至周日。这意味着当仅调用 #next_week 时,它将在下周一 00:00:00:00 返回。

例子:

DateTime.now.next_week
#=> Mon, 03 Aug 2015 00:00:00 -0400

好的,这很有意义。现在你要减去3.hours,让它再次成为星期天

DateTime.now.next_week - 3.hours 
#=> Sun, 02 Aug 2015 21:00:00 -0400

仍然很有意义。现在这里是混乱的地方。由于您通过减去3.hours 回滚到周日,#next_week 又是下周一,所以

(DateTime.now.next_week - 3.hours).next_week
#=> Mon, 03 Aug 2015 00:00:00 -0400

我希望这可以帮助您更好地了解情况。

如果您使用+ 1.week,这将带您到下一周的相同时间点

  DateTime.now + 1.week
  #=> Fri, 07 Aug 2015 09:01:17 -0400

这不依赖于每周日历,而是依赖于将 7 天添加到引用的 Date 对象的基本数学运算。

总之,虽然#next_week 可能很舒服,但您需要了解它的实际含义,我认为在这种情况下我更喜欢+ 1.week,因为它的灵活性和缺乏假设。

通过ActiveSupport进行时间穿越的方法还有很多,比如#advance、#days_since、weeks_since等。

最后注意next_week 也可以接受日期参数,例如

DateTime.now.next_week(:tuesday)
#=> Tue, 04 Aug 2015 00:00:00 -0400
DateTime.now.next_week(:thursday)
#=> Thu, 06 Aug 2015 00:00:00 -0400

【讨论】:

  • 谢谢!这是完美的答案。
猜你喜欢
  • 2015-11-03
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多