【问题标题】:c# serialized JSON date to rubyc# 将 JSON 日期序列化为 ruby
【发布时间】:2009-08-13 14:09:20
【问题描述】:

我有一个 C# 应用程序,它将其 DTO 序列化为 JSON,并将它们发送到线路以供 Ruby 处理。现在序列化日期的格式是这样的:

/Date(1250170550493+0100)/

当它遇到 Ruby 应用程序时,我需要将此字符串表示形式转换回日期/日期时间/时间(无论它在 Ruby 中是什么)。有什么想法我会怎么做?

干杯,克里斯。

【问题讨论】:

    标签: c# ruby json serialization


    【解决方案1】:

    您可以使用Time.strptime 将其解析为具有正确时区的Time 对象:

    Time.strptime(string, "/Date(%Q%z)/")
    

    例如:

    string = "/Date(1250170550493+0100)/"
    Time.strptime(string, "/Date(%Q%z)/")
    #=> 2009-08-13 14:35:50 +0100
    

    【讨论】:

    • 这是迄今为止最优雅的解决方案。奇怪的是,即使是最新的 Ruby 版本,%Q 也没有记录:ruby-doc.org/stdlib-3.0.2/libdoc/time/rdoc/…
    • 是的,这是真的。在内部,它使用Date.strptime,其文档指出格式与Date.strftime 相同。在那里,它被记录为%Q - Number of milliseconds since 1970-01-01 00:00:00 UTC
    【解决方案2】:

    您可以解析出自纪元以来的毫秒数,例如:

    def parse_date(datestring)
      seconds_since_epoch = datestring.scan(/[0-9]+/)[0].to_i / 1000.0
      return Time.at(seconds_since_epoch)
    end
    
    parse_date('/Date(1250170550493+0100)/')
    

    您仍然需要处理时区信息(+0100 部分),所以这是一个起点。

    【讨论】:

    • parse_date('/Date(1250170550493+0100)/') 返回41586-04-30 15:21:33 +0200
    • @narzero 你是对的,在这种情况下,它是自纪元以来的毫秒数,而不是自纪元以来的秒数。修复。
    【解决方案3】:

    您可以使用Json.NET 来序列化您的 DTO,而不是使用内置的 .NET JSON 序列化程序。它为您提供了如何序列化日期的灵活性(即作为构造函数、ISO 格式等)。

    【讨论】:

    • +1,如果您的要求允许您将日期序列化格式更改为 Ruby 更喜欢的格式,这是个不错的选择
    • 顺便说一句 - 我们一直在使用 Json.NET,很棒的库。谢谢詹姆斯!
    【解决方案4】:

    .NET 从纪元开始以毫秒为单位进行序列化,因此您需要将时区之前的部分除以 1000。否则您的日期将相差数千年

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多