我将XML中的Time对象存储为字符串。我无法找出重新初始化它们的最佳方法。从字符串到Time对象,以便对它们执行减法。
这是它们如何存储在xml
中 <time>
<category> batin </category>
<in>2014-10-29 18:20:47 -0400</in>
<out>2014-10-29 18:20:55 -0400</out>
</time>
使用
t = Time.now
我正在使用
从xml访问它们 doc = Nokogiri::XML(File.open("time.xml"))
nodes = doc.xpath("//time").each do |node|
temp = TimeClock.new
temp.category = node.xpath('category').inner_text
temp.in = node.xpath('in').inner_text.
temp.out = node.xpath('out').inner_text.
@times << temp
end
将它们重新转换回Time对象的最佳方法是什么?我没有看到Time对象的方法。我发现可以转换为Date对象。但这似乎只给我一个mm / dd / yyyy格式,这部分是我想要的。
需要能够减去
<out>2014-10-29 18:20:55 -0400</out>
来自
<in>2014-10-29 18:20:47 -0400</in>
XML在某些时候会根据日期存储,但我也需要准确的时间“hh / mm / ss”来执行计算。
任何建议?
答案 0 :(得分:1)
time stdlib使用解析/转换方法扩展了类。
require 'time'
Time.parse('2014-10-29 18:20:47 -0400')
答案 1 :(得分:1)
我做的事情如下:
require 'nokogiri'
require 'time'
doc = Nokogiri::XML(<<EOT)
<xml>
<time>
<category>
<in>2014-10-29 18:20:47 -0400</in>
<out>2014-10-29 18:20:55 -0400</out>
</category>
</time>
</xml>
EOT
times = doc.search('time category').map{ |category|
in_time, out_time = %w[in out].map{ |n| Time.parse(category.at(n).text) }
{
in: in_time,
out: out_time
}
}
times # => [{:in=>2014-10-29 15:20:47 -0700, :out=>2014-10-29 15:20:55 -0700}]
DateTime和Time类都允许解析各种日期/时间格式。某些格式可能会导致爆炸,但这种格式是安全的。如果日期可能在Unix纪元之前,请使用DateTime。
in_time, out_time = %w[in out].map{ |n| Time.parse(category.at(n).text) }
在IRB中查看:
>> doc.search('time category').to_html
"<category>\n <in>2014-10-29 18:20:47 -0400</in>\n <out>2014-10-29 18:20:55 -0400</out>\n</category>"
doc.search('time category')
返回所有<category>
个节点的NodeSet。
>> %w[in out]
[
[0] "in",
[1] "out"
]
返回一个字符串数组。
Time.parse(category.at(n).text)
返回n
节点下的<category>
节点,n
首先'in'
,然后'out'
。