向私有(无公共文档)API发出GET请求以JSON格式返回数据。
我感兴趣的价值是日期。它以ASP.NET JSON日期格式返回日期。这是它的样子:
AanmeldDatum: "/Date(1406675114000+0200)/"
另一个名为AangebodenSindsTekst的变量意味着OfferedSinceText,它的值是“8 augustus 2014”。因此,未知的日期格式应该被解析为该特定值。
我试过这个:
require 'time'
foo = Time.strptime('1406675114000+0200', '%N') # => 2014-08-12 13:38:46 +0200
foo = Time.strptime('1406675114000+0200', '%N%z') # => 2014-08-12 14:38:58 +0200
但它只是返回当前时间。
我知道在解析时{100}确定/Date(1406675114000+0200)/
,应该返回日期2014-07-30
。
问题是如何确定它呢?
答案 0 :(得分:3)
使用'%N'
或'%N%z'
似乎会触发strptime
中的错误,从而导致当前日期/时间:
Time.strptime('1262300400000+0100', '%N') # => 2014-08-14 16:30:01 -0700
Time.strptime('1262300400000+0100', '%N%z') # => 2014-08-14 08:30:01 -0700
使用'%Q%z'
解析:
Time.strptime('1262300400000+0100', '%Q%z') # => 2010-01-01 00:00:00 +0100
Time.strptime
documentation并未提及'%Q'
,但DateTime.strptime
doc确实如此。
如果你已经解析了日期字符串,那么格式化很容易:
foo = Time.strptime('1262300400000+0100', '%Q%z') # => 2010-01-01 00:00:00 +0100
foo.strftime('%Y-%m-%d %H:%M:%S %z') # => "2010-01-01 00:00:00 +0100"
有关格式选项的详情,请参阅the strftime
documentation。
请注意,'%Y-%m-%d'
和'%H:%M:%S'
等内容有一些快捷方式:
foo.strftime('%F %T %z') # => "2010-01-01 00:00:00 +0100"
真正的问题是.NET如何在JSON中序列化日期。对谷歌的搜索显示了许多关于此的页面:
.NET并不是唯一这样做的。 Ruby的JSON和YAML序列化程序偶尔也会做类似的事情,修复方法是查看输出的JSON,然后提供to_json
或to_s
或to_h
处理程序导致JSON输出最能代表数据。 JSON应该可以在JavaScript和后端系统之间转换,而.NET并不是提供该功能的唯一语言。 Perl,Ruby,Python,谁知道有多少其他语言可以解析和发出JSON,他们都需要遵循相同的规则。