时间对象将String对象转换为XML并在Ruby中再次返回

时间:2014-10-30 16:46:03

标签: ruby xml time

我将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”来执行计算。

任何建议?

2 个答案:

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

DateTimeTime类都允许解析各种日期/时间格式。某些格式可能会导致爆炸,但这种格式是安全的。如果日期可能在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'