我不熟悉Ruby,但我有一个为我编写的脚本,我正在尝试修改。该脚本现在用一个偏移量替换文档中的时间戳,时间戳为HH:MM格式:
#!/usr/bin/env ruby
h, m, = 12, 07
$_.gsub!(/(\d\d):(\d\d)/) do
'%02d:%02d' % (($1.to_i + h) * 60 + $2.to_i + m).divmod(60)
end
我想在偏移量中添加一个秒字段,以便我可以找到并更新HH:MM:SS格式的时间戳。我将如何实现这一目标?
答案 0 :(得分:0)
如果您不想要实例化Time对象的开销,您可以在结果字符串的末尾添加:00:
require 'time'
h,m,s= "09:30:03".split(':').map(&:to_i) # h,m,s = 9,30,3 would work here too
$_.gsub! /\[(\d\d:\d\d:\d\d)\]/ do
# time is in seconds so multiply by 60 to get minutes' seconds
# and again to get hours'
t = Time.parse($1) + (h * 60 * 60) + (m * 60) + s
"[#{t.strftime("%H:%M:%S")}]"
end
也许这样的事情会起作用:
est(k(:,1)~=0, 1) = 0;
答案 1 :(得分:0)
通过了解当前代码的作用,可以通过重写代码来添加修改/重写表达为HH:MM:SS
的时间的功能。
首先,让我们看看这一行并解读它的作用,
$_.gsub!(/(\d\d):(\d\d)/) do
$_
是您使用gsub!
函数处理的输入行。
正则表达式/(\d\d):(\d\d)/
表示匹配两个数字对,用冒号(':')分隔,数字对周围的括号表示将它们复制到名为{{的变量中1}}和$1
,稍后会使用。
由于您要检测并处理$2
,因此您需要修改正则表达式以检测此模式HH:MM:SS
,该模式会将/(\d\d):(\d\d):(\d\d)/
存储到HH
中, $1
分别为MM
,$2
分别为SS
。
以下是该行的外观,修改为添加第三个匹配秒,
$3
下一行执行多次计算,并使用$_.gsub!(/(\d\d):(\d\d):(\d\d)/) do
格式说明符将结果打印到字符串中。
%
第一个表达式 '%02d:%02d' % (($1.to_i + h) * 60 + $2.to_i + m).divmod(60)
将第一个匹配的($1.to_i + h) * 60
转换为整数,然后将\d\d
的值相加,然后乘以h=12
。
第二个表达式60
将第二个匹配的$2.to_i + m
转换为整数,然后添加\d\d
的值。
m=07
生成一个包含两个元素的列表,对应于整数除divmod(60)
,整数余数除以60
。这是不必要的,仅用于检测并将分钟偏移中的溢出移动到小时元素中。
由于您想要添加秒数,您可能需要处理秒数偏移量,以下内容将处理从秒开始然后从分钟开始的溢出,
60
将上述内容组合在一起,
hour, min, sec = [ $1.to_i + h, $2.to_i + m, $3.to_i + s ]
if sec >= 60 then min += 1; sec -=60; end #only needed if s > 0
if min >= 60 then hr += 1; min -=60; end #must do before seconds offset
'%02d:%02d:%02d' % [hour, min, sec]