【发布时间】:2009-08-13 14:09:20
【问题描述】:
我有一个 C# 应用程序,它将其 DTO 序列化为 JSON,并将它们发送到线路以供 Ruby 处理。现在序列化日期的格式是这样的:
/Date(1250170550493+0100)/
当它遇到 Ruby 应用程序时,我需要将此字符串表示形式转换回日期/日期时间/时间(无论它在 Ruby 中是什么)。有什么想法我会怎么做?
干杯,克里斯。
【问题讨论】:
标签: c# ruby json serialization
我有一个 C# 应用程序,它将其 DTO 序列化为 JSON,并将它们发送到线路以供 Ruby 处理。现在序列化日期的格式是这样的:
/Date(1250170550493+0100)/
当它遇到 Ruby 应用程序时,我需要将此字符串表示形式转换回日期/日期时间/时间(无论它在 Ruby 中是什么)。有什么想法我会怎么做?
干杯,克里斯。
【问题讨论】:
标签: c# ruby json serialization
您可以使用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
【讨论】:
%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。
您可以解析出自纪元以来的毫秒数,例如:
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
您可以使用Json.NET 来序列化您的 DTO,而不是使用内置的 .NET JSON 序列化程序。它为您提供了如何序列化日期的灵活性(即作为构造函数、ISO 格式等)。
【讨论】:
.NET 从纪元开始以毫秒为单位进行序列化,因此您需要将时区之前的部分除以 1000。否则您的日期将相差数千年
【讨论】: