以 [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