ruby 中的新日期时间而不是字符串

Posted

技术标签:

【中文标题】ruby 中的新日期时间而不是字符串【英文标题】:New DateTime instead of String in ruby 【发布时间】:2017-10-24 21:58:56 【问题描述】:

我在 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 类是字符串。我怎样才能将它们作为 DateTime?

【问题讨论】:

您是否将行传递给函数?当前行未定义 你有一个字符串"DateTime.new(1979,1,1) DateTime.new(2012,3,29)"?为什么? 这很可能是一个“XY Problem”。为什么你的文本文件中有那一行? 【参考方案1】:

如果您想要 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,而是 Dates:

'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)>]

更大的问题是为什么您会在文本文件中获得类似的值。

【讨论】:

【参考方案2】:

这个:

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

【讨论】:

【参考方案3】:

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

@date_of_birth = array[0].to_datetime
@date_of_death = array[1].to_datetime

查看这里了解更多信息:

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

【讨论】:

以上是关于ruby 中的新日期时间而不是字符串的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 中的日期时间解析

如何检查变量是不是是 Ruby 中的日期或时间或日期时间?

将字符串转换为日期时间

获取Java中的当前时间(以毫秒为单位)(只是时间,而不是日期)

熊猫仅分箱时间列而不是自定义范围中的日期[重复]

从字符串转换为日期时间时获取常规日期时间格式而不是纪元时间?