将 Ruby 日期转换为整数

72

我该如何将 Ruby 的日期转换为整数?


2
这个整数应该代表什么? - Phrogz
我需要显示一个图表。所以我想要缩放日期。MinDate将为零。最大日期将为100。 - Brig
然后,如我所示的解决方案,只需将两个“日期”对象相减即可得到它们之间的天数。如果你实际上是指日期/时间戳,你也可以相减“时间”对象(在这种情况下你会得到它们之间的秒数),或者你可以使用“日期时间”对象(它们产生实例之间的小数天数)。 - Phrogz
可能是重复的问题:Ruby/Rails: 将日期转换为UNIX时间戳 - Duncan Jones
6个回答

95
t = Time.now
# => 2010-12-20 11:20:31 -0700

# Seconds since epoch
t.to_i
#=> 1292869231

require 'date'
d = Date.today
#=> #<Date: 2010-12-20 (4911101/2,0,2299161)>

epoch = Date.new(1970,1,1)
#=> #<Date: 1970-01-01 (4881175/2,0,2299161)>

d - epoch
#=> (14963/1)

# Days since epoch
(d - epoch).to_i
#=> 14963

# Seconds since epoch
d.to_time.to_i
#=> 1292828400

我在核心文档中没有看到 to_time 的相关内容:http://corelib.rubyonrails.org/classes/Date.html,直到 Ruby 1.9.2 (http://ruby-doc.org/stdlib/libdoc/date/rdoc/classes/Date.html) 才有。此时,您可以直接使用 to_i - JellicleCat
2
Ruby 1.8.* 有解决方案吗? - JellicleCat
@JellicleCat 你需要什么?将 Ruby 的日期转换为时间?获取自纪元以来的天数?获取自纪元以来的秒数? - Phrogz
2
你的自纪元以来的秒数示例是错误的。请参见https://dev59.com/hm855IYBdhLWcg3wKxHc#4492607。 - andrewrk
@superjoe30 感谢您的评论,我会澄清我的答案。请注意,如果用户拥有一个Date实例而不是TimeDateTime,那么整数秒将永远不会每秒增加。 - Phrogz
显示剩余3条评论

37

日期不能直接转换为整数。例如:

$ Date.today
=> #<Date: 2017-12-29 ((2458117j,0s,0n),+0s,2299161j)>
$ Date.today.to_i
=> NoMethodError: undefined method 'to_i' for #<Date: 2017-12-29 ((2458117j,0s,0n),+0s,2299161j)>

您的选择是将日期转换为时间,然后转换为整数,这将给您自纪元以来的秒数:

$ Date.today.to_time.to_i
=> 1514523600

或者你可以选择其他数字,比如自纪元以来的天数:

$ Date.today.to_time.to_i / (60 * 60 * 24)  ### Number of seconds in a day
=> 17529   ### Number of days since epoch

这完全不是真的,自1.9.3版本以来,Ruby就原生支持从jd转换和转换为jd - Pelle

12
Time.now.to_i

返回自纪元以来的秒数格式


我开始使用一个日期对象而不是一个时间对象。 - Brig
4
使用 my_date.to_time 可以将一个 Date 对象转换为一个 Time 对象。 - Phrogz
13
请注意,to_time 方法将使用系统时区,因此您可能需要明确指定:my_date.to_time(:utc).to_i - davetapley
你使用日期的一个原因是为了避免这个问题。使用 Date#jd 将是更好的解决方案。 - Pelle

7

针对 Ruby 1.8 及任意 DateTime 对象的解决方案:

1.8.7-p374 :001 > require 'date'
 => true 
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s')
 => "1326585600"

Token +1,不过你知道,Ruby 1.8很快就要被淘汰了。 - Boris Stitnicky
1
只要还有能够正常工作的1.8应用程序存在,我就不会被说服 :) - Nowaker

1

我非常惊讶,没有人给出我认为最正确的答案。

自Ruby 1.9.3以来,日期可以从整数转换。要获取任何日期的儒略日编号,只需使用:

> Date.today.jd
 => 2460011

> Date.jd(2460011)
 => Tue, 07 Mar 2023

0

最近我也遇到了这个问题,花了一些时间才解决,但是我找到了一个解决方案,希望能给你一些启示:

require 'date'
today = Date.today

year = today.year
month = today.mon
day = day.mday

year = year.to_s

month = month.to_s

day = day.to_s    


if month.length <2
  month = "0" + month
end

if day.length <2
  day = "0" + day
end

today = year + month + day

today = today.to_i

puts today

在发布此文章的日期,它将显示20191205。
如果月份或日期少于2位数字,它将在左侧添加0。
我这样做是因为我必须将当前日期与以整数格式从数据库中获取的某些数据进行比较。希望能对您有所帮助。

这是一个很好的解决方案,但是它产生的数字不会很好地扩展。由于月份是1-12,而日期是1-30。这将导致范围中存在间隙。 - Brig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接