【问题标题】:Rails time is weirdRails 时间很奇怪
【发布时间】:2016-01-21 19:24:38
【问题描述】:
<% if  post.created_at < 30.days.ago %>
  <%= post.created_at.strftime("%b %d, %Y") %> 
<% else %>
  <%= time_ago_in_words(post.created_at) %>
<% end%>

帖子是在不到 30 天前创建的,但第二个条件运行。这很奇怪,当我更改第一行并将其设为 post.created_at &gt; 30.days.ago 时,它会返回第一个条件,即使它是错误的,因为帖子创建得更早。

如果有人能解释为什么会这样,我可以做些什么来改变它(如果有的话)。

【问题讨论】:

  • @MrYoshiji 它没有改变任何东西。输出还是一样的。

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


【解决方案1】:

这段代码在英文中是有意义的:

post.created_at < 30.days.ago

你的大脑会这样理解:

如果此帖子创建时间少于 30 天...

然而,Ruby 将其读作:

如果此帖子的创建日期小于(之前)30 天前的日期...

请记住,30.days.ago 返回的是日期时间,而不是持续时间。假设post.created_at 是两周前,即 2016-01-06(它实际上是一个 DateTime,但为了演示,我们将忽略时间)。两周不到 30 天,因此您可能希望您的表达式计算为 true。但是,30.days.ago 返回日期 2015-12-22。将这些值放入我们的表达式中(现在是伪代码):

2016-01-06 < 2015-12-22

计算结果为false,因为左边的日期早于(阅读:不少于)右边的日期。

为了测试post.created_at是否在(读:大于)30.days.ago之后,我们必须把操作符反过来:

if post.created_at > 30.days.ago

附:另一种思考方式是 30 天前的日期是否早于(小于)post.created_at。这基本上(如果不完全)是等价的:

if post.created_at > (DateTime.now - 30.days)

或者你可以考虑post.created_at是否介于30.days.ago和今天之间:

if post.created_at.between?(30.days.ago, DateTime.now)

或者,自post.created_at 以来经过的时间是否小于 30 天:

if (DateTime.now - post.created_at) < 30.days

(请注意,30.days.ago 返回日期时间,30.days 返回持续时间。)

【讨论】:

    【解决方案2】:

    我认为你误解了你的病情是如何运作的。

    在这种情况下,如果date_1date_2之前,则if语句成功:

    if date_1 < date_2
      # do something
    end
    

    在您的代码中,如果帖子是在 30 天前之前创建的,则 if 语句成功。

    您可能想要的是 30 天前之后的数据?

    【讨论】:

    • 第一个条件是 if post.created_at &lt; 30.days.ago 帖子是在不到 30 天前创建的,但是该代码不运行 else 代码运行。
    • 条件不是这样。正如 Jon 解释的那样,条件是 post.created_at 应该在 (
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2021-05-08
    • 2012-01-19
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多