以 [HH:MM:SS] 格式更新文档中的时间戳?
Updating timestamps in a document in [HH:MM:SS] format?
我不熟悉 Ruby,但我有一个为我编写的脚本,我正在尝试修改它。该脚本现在用偏移量替换文档中的时间戳,时间戳采用 HH:MM 格式:
#!/usr/bin/env ruby
h, m, = 12, 07
$_.gsub!(/(\d\d):(\d\d)/) do
'%02d:%02d' % ((.to_i + h) * 60 + .to_i + m).divmod(60)
end
我只想向偏移量添加一个秒字段,以便我可以查找和更新 HH:MM:SS 格式的时间戳。我将如何做到这一点?
如果您不想实例化 Time 对象的开销,您可以在结果字符串的末尾附加 :00:
#!/usr/bin/env ruby
h, m, s = 12, 07, 10
$_.gsub!(/(\d\d):(\d\d)/) do
'%02d:%02d' % ((.to_i + h) * 60 + .to_i + m).divmod(60) + ":#{s}"
end
也许这样的事情会奏效:
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() + (h * 60 * 60) + (m * 60) + s
"[#{t.strftime("%H:%M:%S")}]"
end
通过重写您已有的代码,将 revise/rewrite 表示为 HH:MM:SS
的时间添加的能力可以通过理解当前代码的作用来简化。
首先,让我们看一下这一行并解读它的作用,
$_.gsub!(/(\d\d):(\d\d)/) do
$_
是您正在使用 gsub!
函数处理的输入行。
正则表达式 /(\d\d):(\d\d)/
表示匹配两个数字对,用冒号 (':') 分隔,数字对周围的括号表示将它们复制到名为 </code> 和<code>
,后面用到
因为你想检测和处理 HH:MM:SS
,你需要修改你的正则表达式来检测这个模式,/(\d\d):(\d\d):(\d\d)/
,它将把 HH
存储到 </code>, <code>MM
分别变成 </code>, <code>SS
变成 </code>.</p>
<p>这是该行的样子,经过修改以添加第三个秒匹配项,</p>
<pre><code>$_.gsub!(/(\d\d):(\d\d):(\d\d)/) do
下一行进行多项计算,并使用 %
格式说明符将结果打印到字符串中。
'%02d:%02d' % ((.to_i + h) * 60 + .to_i + m).divmod(60)
第一个表达式(.to_i + h) * 60
将第一个匹配的\d\d
转换为整数,然后加上h=12
的值,然后乘以60
。
第二个表达式.to_i + m
将第二个匹配的\d\d
转换为整数,然后加上m=07
的值。
divmod(60)
生成一个包含两个元素的列表,对应于 60
的整数除法和 60
的整数除法余数。这是不必要的,仅用于检测溢出并将其从分钟偏移移至小时元素。
既然要加秒,可能要处理秒的偏移量,下面会处理从秒到分的溢出,
hour, min, sec = [ .to_i + h, .to_i + m, .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]
将以上组合在一起,
#!/usr/bin/env ruby
h, m, s = 12, 07, 13
$_.gsub!(/(\d\d):(\d\d):(\d\d)/) do
hour, min, sec = [ .to_i + h, .to_i + m, .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]
end
我不熟悉 Ruby,但我有一个为我编写的脚本,我正在尝试修改它。该脚本现在用偏移量替换文档中的时间戳,时间戳采用 HH:MM 格式:
#!/usr/bin/env ruby
h, m, = 12, 07
$_.gsub!(/(\d\d):(\d\d)/) do
'%02d:%02d' % ((.to_i + h) * 60 + .to_i + m).divmod(60)
end
我只想向偏移量添加一个秒字段,以便我可以查找和更新 HH:MM:SS 格式的时间戳。我将如何做到这一点?
如果您不想实例化 Time 对象的开销,您可以在结果字符串的末尾附加 :00:
#!/usr/bin/env ruby
h, m, s = 12, 07, 10
$_.gsub!(/(\d\d):(\d\d)/) do
'%02d:%02d' % ((.to_i + h) * 60 + .to_i + m).divmod(60) + ":#{s}"
end
也许这样的事情会奏效:
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() + (h * 60 * 60) + (m * 60) + s
"[#{t.strftime("%H:%M:%S")}]"
end
通过重写您已有的代码,将 revise/rewrite 表示为 HH:MM:SS
的时间添加的能力可以通过理解当前代码的作用来简化。
首先,让我们看一下这一行并解读它的作用,
$_.gsub!(/(\d\d):(\d\d)/) do
$_
是您正在使用 gsub!
函数处理的输入行。
正则表达式 /(\d\d):(\d\d)/
表示匹配两个数字对,用冒号 (':') 分隔,数字对周围的括号表示将它们复制到名为 </code> 和<code>
,后面用到
因为你想检测和处理 HH:MM:SS
,你需要修改你的正则表达式来检测这个模式,/(\d\d):(\d\d):(\d\d)/
,它将把 HH
存储到 </code>, <code>MM
分别变成 </code>, <code>SS
变成 </code>.</p>
<p>这是该行的样子,经过修改以添加第三个秒匹配项,</p>
<pre><code>$_.gsub!(/(\d\d):(\d\d):(\d\d)/) do
下一行进行多项计算,并使用 %
格式说明符将结果打印到字符串中。
'%02d:%02d' % ((.to_i + h) * 60 + .to_i + m).divmod(60)
第一个表达式(.to_i + h) * 60
将第一个匹配的\d\d
转换为整数,然后加上h=12
的值,然后乘以60
。
第二个表达式.to_i + m
将第二个匹配的\d\d
转换为整数,然后加上m=07
的值。
divmod(60)
生成一个包含两个元素的列表,对应于 60
的整数除法和 60
的整数除法余数。这是不必要的,仅用于检测溢出并将其从分钟偏移移至小时元素。
既然要加秒,可能要处理秒的偏移量,下面会处理从秒到分的溢出,
hour, min, sec = [ .to_i + h, .to_i + m, .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]
将以上组合在一起,
#!/usr/bin/env ruby
h, m, s = 12, 07, 13
$_.gsub!(/(\d\d):(\d\d):(\d\d)/) do
hour, min, sec = [ .to_i + h, .to_i + m, .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]
end