ruby-on-rails - 如何将字符串转换为时间对象?

标签 ruby-on-rails ruby

我搜索了我的问题并得到了很多解决方案,但遗憾的是没有一个能满足我的需求。

我的问题是,我有两个或多个字符串,我想将这些字符串转换为时间,然后将它们相加:

time1 = "10min 43s"
time2 = "32min 30s"

输出将是:43min 13s

我尝试的解决方案是:

time1 = "10min 43s" 
d1=DateTime.strptime(time1, '%M ') 
# Sat, 02 Nov 2013 00:10:00 +0000 
time2 = "32min 30s" 
d2=DateTime.strptime(time2, '%M ') 
# Sat, 02 Nov 2013 00:32:00 +0000 

那我就进不去

最佳答案

有很多方法可以做到这一点。这是另一个:

time1 = "10min 43s"
time2 = "32min 30s"

def get_mins_and_secs(time_str)
  time_str.scan(/\d+/).map(&:to_i)
    #=> [10, 43] for time_str = time1, [32, 30] for time_str = time2 
end

min, sec   = get_mins_and_secs(time1)  
min2, sec2 = get_mins_and_secs(time2)  
min += min2
sec += sec2

if sec > 59
  min += 1
  sec -= 60
end

puts "#{min}min #{sec}sec"

让我们考虑一下这里发生了什么。首先,您需要从时间字符串中提取分钟和秒。我做了一个方法来做到这一点:

def get_mins_and_secs(time_str)
  time_str.scan(/\d+/).map(&:to_i)
    #=> [10, 43] for time_str = time1, [32, 30] for time_str = time2 
end

对于 time_str = "10min 43s", 我们应用 String@scan将两个数字提取为字符串的方法:

"10min 43s".scan(/\d+/) # => ["10", "43"]

Array#map然后用于将这两个字符串转换为整数

["10", "43"].map {|e| e.to_i} # => [10, 43]

这可以更简洁地写成

["10", "43"].map(&:to_i} # => [10, 43]

通过将 map 链接到 scan 我们获得

"10min 43s".scan(/\d+/).map(&:to_i} # => [10, 43]

数组 [10, 43] 由变量 minsec 返回和接收(解构):

min, sec = get_mins_and_secs(time_str)

剩下的就很简单了。

关于ruby-on-rails - 如何将字符串转换为时间对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19733099/

相关文章:

ruby-on-rails - 使用 Phusion Passenger、Apache 和 Rails 进行 Assets 预编译

ruby-on-rails - Json -v 1.8.6 不会作为 capistrano 部署的一部分安装

ruby-on-rails - 在一个项目中使用两个不同的数据库

ruby-on-rails - 打开 gems [Rails 2.3.5]

ruby-on-rails - rails : prevent flash message from showing twice

ruby - 按 ruby​​ 中数组的元素属性排序

Ruby 意外 ':' ,期待 kEND

ruby-on-rails - Heroku 无法在我的 Ruby on Rails 应用程序中找到文件 - 即使它们就在那里?

ruby-on-rails - Ruby on Rails 突出显示导航栏上的当前链接?

ruby-on-rails - 如何在 Ruby on Rails 中复制记录及其相关记录?