Oj Time dump - linux和windows的差异

时间:2016-05-03 21:55:51

标签: ruby json windows ms-access

我有一个从Access数据库获取的时间戳。不幸的是,时间戳仅代表时间,但存储为1899-12-30 13:05:00 +0000。它的日期部分位于不同的字段中。当我将它存储在json blob中时,我需要尽可能地保留数据。

我正在使用Oj(很棒)将数据转储到json。我在Windows平台上遇到以下行为:

irb(main):001:0> require 'oj'
=> true
irb(main):002:0> t = Time.new(1899,12,30,13,5,0) #this is my actual timestamp
=> 1899-12-30 13:05:00 +0000
irb(main):003:0> Oj.dump(t)
RangeError: bignum too big to convert into `long'
        from (irb):3:in `dump'
        from (irb):3
        from C:/RailsInstaller/Ruby2.2.0/bin/irb:11:in `<main>'
irb(main):004:0>

现在,在linux上:

2.3.0 :001 > require 'oj'
 => true 
2.3.0 :002 > t = Time.new(1899,12,30,13,5,0)
 => 1899-12-30 13:05:00 +0000 
2.3.0 :003 > Oj.dump(t)
 => "{\"^t\":-2209114500.000000000e0}"

我需要在Windows上完成这项工作,因为我的源数据库是MS Access。请帮忙。

1 个答案:

答案 0 :(得分:0)

时间处理不当,但您可以转换为浮点数。结果字符串与原始字符串略有不同:

 irb(main):001:0> require 'oj'
 => true
 irb(main):002:0> t = Time.new(1899,12,30,13,5,0)
 => 1899-12-30 13:05:00 +0100
 irb(main):003:0> Oj.dump(t)
 RangeError: bignum too big to convert into `long'
    from (irb):3:in `dump'
    from (irb):3
    from C:/Ruby23-x64/bin/irb.cmd:19:in `<main>'
 irb(main):005:0> Oj.dump(t.to_f)
 => "-2209118100.0"

或者,如果您需要确切的响应,可以使用数组:

irb(main):001:0> require 'oj'
=> true
irb(main):002:0> t = Time.new(1899,12,30,13,5,0)
=> 1899-12-30 13:05:00 +0100
irb(main):012:0> A1 = Array.new(1) 
=> [nil]
irb(main):017:0> A1[0] = '^t'
=> "^t"
irb(main):028:0> A1[1] = t.to_f
=> "-2209118100.0"
irb(main):035:0> Oj.dump(A1).tr("[","{").tr("]","}")
=> "{\"^t\",\"-2209118100.0\"}"