【问题标题】:Ruby: how to find a date by the year dayRuby:如何按年查找日期
【发布时间】:2021-05-06 17:48:03
【问题描述】:

如何根据当年的日期找到日期? 比如你有一年的第235天,它对应的是哪个日期?

例如,您可以按如下方式查找一年中的某一天:

Date.today.yday
#=> 126 (for May 6, 2021)

如何实现相反的效果?

Date.some_method(126)
#=> 2021-05-06

我尝试如下:

now = Date.today
#=> Thu, 06 May 2021
start_year = now.beginning_of_year
#=> Fri, 01 Jan 2021 

start.advance(days: (start.yday + 126))
#=> Sat, 08 May 2021 

为什么相差2天?

【问题讨论】:

  • 区别在于start.yday 是1,而不是0。因此,要获得一年中的第一天,您必须提前 0 天(您已经在那里),所以应该是 .advance(days: 125) 才能获得一年中的第 126 天(当您提前 127 天时)
  • 啊,谢谢你,很好!

标签: ruby activesupport


【解决方案1】:

这应该可以工作(纯红宝石):

def day_of_year(num)
  Date.new(Date.today.year) + num - 1
end

day_of_year(1) #=> 01/01/2021
day_of_year(235) #=> 23/08/2021

另一种选择:

def day_of_year(num)
  Date.strptime(num.to_s, "%j")
end

day_of_year(1) #=> 01/01/2021
day_of_year(235) #=> 23/08/2021

注意:@steenslag 发布了实际正确的答案 - 请去投票。

【讨论】:

  • 太棒了!非常感谢!
  • 如果添加括号,则首先计算整数天偏移量,然后才进行日期计算。而此版本会进行两次日期计算。仅供参考,它不会对实际代码产生太大影响,但也不会使您的代码更复杂。 Date.new(Date.today.year) + (num - 1)
  • @Pascal - 我想这可能是低级语言的一些差异。 ruby 中没有原始类型,因此日期和整数计算之间几乎没有区别。只是为了好玩,我对这两个选项都进行了基准测试 - 10^12 次运行的平均值绝对没有差异。
  • @BroiSatse 实际上我在写评论之前做了一个基准测试,以确保差异是显而易见的。 gist.github.com/pascalbetz/efe2c12861d1f3c167a6c00a1ca1f81a 愿意分享你的吗?关于为什么你没有注意到任何差异的古玩。也许是不同的红宝石版本?在任何情况下:添加整数(原始或对象)比创建新的 Date 对象更便宜。
  • 啊,太好了 - 你的基准测试更好(而且我已经了解了 ips,这很酷)。 :) 但是,我们仍然在谈论 10^-7 秒的差异。如果我要从事的项目会产生丝毫不同,那么 ruby​​ 就不是可以使用的语言了 :)
【解决方案2】:

Date.ordinal 为您提供日期、年份和数字。您甚至可以指定一个负数,这将计算从年底开始倒数的日期。 doc

【讨论】:

  • 我觉得我现在应该删除我的答案:) 有没有办法转移投票?
  • 谢谢你,@steenslag,我不知道它存在 :)。真的很有用:Date.ordinal(2021, 126) #=> #<Date: 2021-05-06 ((2459341j,0s,0n),+0s,2299161j)>
【解决方案3】:

试试这个。

Date.today - (Date.today.yday - 126)

【讨论】:

    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多