如何编写一个函数,将持续时间转换为以毫秒为单位的时间,并说明无效值



我使用的是Rails 5和Ruby 2.4。我想转换一个字符串,它表示持续时间(时间)为毫秒,所以我有这个函数

def duration_in_milliseconds(input)
if input && input.count("a-zA-Z ") == 0 
if input.index(".") && !input.index(":")
input.gsub!(/./, ':')
end
# replace bizarre apostraphes where they intended ":"'s
input.gsub!(/'/, ':')  
# Strip out unnecessary white space 
input.gsub!(/Ap{Space}+|p{Space}+z/, '')  
input.split(':').map(&:to_f).inject(0) { |a, b| a * 60 + b } * 1000
else
0
end
end

这适用于"6:52"(6分钟,52秒)这样的字符串,但也适用于"52:6"(无效,"52:06"是正确的)。如果有人在":"前面的第一个数字以外的任何位置输入个位数,我希望函数返回零。我该怎么做?请注意,我仍然希望像"15:24.8"这样的持续时间能够正常解析(即15分24秒,十分之八秒)。

我试图为此找到一个解决方案,但最终重新编写了代码。

我开始把绳子拆开,去掉所有的空白。为了首先去除空白,我确保没有前导或尾随空白,然后在:字符之前或之后加入任何额外的空间。

然后,我将拆分返回的值分配给我命名为hrminseg的3个变量。如果您不熟悉这一点,则从左到右填写变量,如果没有足够的元素,则剩余的变量将获得nil

然后,条件。对此,我说:"如果minseg在存在时不匹配两个连续的数字字符,则返回零">

最后,我以秒为单位对它们各自的值求和,返回秒数。在这行的最后,我将其乘以1000 ,将其转换为毫秒

def duration_in_milliseconds(input)
hr, min, seg = input.strip.split(/s*:s*/)
return 0 if [min, seg].any? {|value| value && !(value =~ /dd/)}
(hr.to_i * 60 * 60 + min.to_i * 60 +  seg.to_i) * 1000
end

我在一堆绳子上试了一下,以确保它能起作用。

duration_in_milliseconds("0:00:01")             # => 1000
duration_in_milliseconds("0:01:01")             # => 61000
duration_in_milliseconds("1:01:01")             # => 3661000
duration_in_milliseconds("0:15")                # => 900000
duration_in_milliseconds("1:   05")             # => 3900000
duration_in_milliseconds("1:5")                 # => 0
duration_in_milliseconds("1:5 ")                # => 0
duration_in_milliseconds(" t 1 : 05  : 15   ") # => 3915000
duration_in_milliseconds("1:5:15")              # => 0
duration_in_milliseconds("1")                   # => 3600000
duration_in_milliseconds("1:5D:15")             # => 0

我希望它能帮助并(以某种方式)回答这个问题,如果没有,请不要犹豫打电话给我。

干杯

Fede

最新更新