ruby中的新DateTime而不是String

时间:2017-05-24 13:50:22

标签: ruby-on-rails ruby datetime

我在Ruby中遇到了DateTime的问题 我有这样的行(它在.txt文件中)

DateTime.new(1979,1,1) DateTime.new(2012,3,29)

我的功能看起来像这样

def split_line
  array = line.split(' ')
  @date_of_birth = array[0] 
  @date_of_death = array[1] 
end

但是@date_of_birth@date_of_death类是String。我怎样才能将它们作为DateTime?

3 个答案:

答案 0 :(得分:0)

假设您的字符串格式正确,那么您可能正在寻找:

call echo %%select%%

有关详细信息,请参阅此处:

https://apidock.com/rails/String/to_datetime

答案 1 :(得分:0)

这:

DateTime.new(1979,1,1) DateTime.new(2012,3,29)

不是代码。你期望这样做什么?

如果您想要两个DateTimes作为空格分隔的字符串,请执行以下操作:

"#{DateTime.new(1979,1,1)} #{DateTime.new(2012,3,29)}" 

当你在一组双引号内有#{...}之类的东西时(必须是双引号而不是单引号),它被称为string interpolation 。学习它。爱它。住它。

但是,对于我的生活,我不知道你为什么不这样做:

[DateTime.new(1979,1,1), DateTime.new(2012,3,29)]

这会为您提供array,因此不需要split。只是:

def split_line
  @date_of_birth = array[0] 
  @date_of_death = array[1] 
end

答案 2 :(得分:0)

如果您想要DateTime值,请抓取数字并创建它们:

require 'date'

'DateTime.new(1979,1,1) DateTime.new(2012,3,29)'.split.map { |s|
  DateTime.new(*s.scan(/\d+/).map(&:to_i) )
}
# => [#<DateTime: 1979-01-01T00:00:00+00:00 ((2443875j,0s,0n),+0s,2299161j)>,
#     #<DateTime: 2012-03-29T00:00:00+00:00 ((2456016j,0s,0n),+0s,2299161j)>]

值不是DateTime,它们是日期:

'DateTime.new(1979,1,1) DateTime.new(2012,3,29)'.split.map { |s|
  Date.new(*s.scan(/\d+/).map(&:to_i) )
}
# => [#<Date: 1979-01-01 ((2443875j,0s,0n),+0s,2299161j)>,
#     #<Date: 2012-03-29 ((2456016j,0s,0n),+0s,2299161j)>]

打破它:

'DateTime.new(1979,1,1) DateTime.new(2012,3,29)'.split # => ["DateTime.new(1979,1,1)", "DateTime.new(2012,3,29)"]
  .map { |s|
  Date.new(
    *s.scan(/\d+/) # => ["1979", "1", "1"], ["2012", "3", "29"]
    .map(&:to_i) # => [1979, 1, 1],       [2012, 3, 29]
  )
}
# => [#<Date: 1979-01-01 ((2443875j,0s,0n),+0s,2299161j)>,
#     #<Date: 2012-03-29 ((2456016j,0s,0n),+0s,2299161j)>]
像这样使用的

*(AKA“splat”)会将数组分解为其元素,这在有数组时非常有用,但该方法只需要单独的参数。

更大的问题是为什么你在文本文件中获得这样的值。