以[HH:MM:SS]格式更新文档中的时间戳?

时间:2015-06-05 15:33:18

标签: ruby timestamp

我不熟悉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格式的时间戳。我将如何实现这一目标?

2 个答案:

答案 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]