为什么Time.strptime()返回当前日期?
向私有(无公共文档)API发出GET请求以JSON格式返回数据。
我感兴趣的价值是日期。 它以ASP.NET JSON日期格式返回日期。 这是它的样子:
AanmeldDatum: "/Date(1406675114000+0200)/"
还有一个名为AangebodenSindsTekst的变量,意思是OfferedSinceText,它的值是“8 augustus 2014”。 因此,未知的Date格式应该被解析为该特定值。
我试过这个:
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
。
问题是我该如何确定它呢?
使用'%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
文档没有提到'%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"
有关格式化选项的详细信息,请参阅strftime
文档 。
请注意,有一些快捷方式可用于'%Y-%m-%d'
和'%H:%M:%S'
:
foo.strftime('%F %T %z') # => "2010-01-01 00:00:00 +0100"
真正的问题是.NET如何在JSON中序列化日期。 搜索谷歌显示了许多页面谈论这个:
- “ 处理ASP.NET MVC中的JSON日期 ”
- “ 关于JSON日期的噩梦。另外,JSON.NET和ASP.NET Web API ”
.NET并不是唯一一个这样做的人。 Ruby的JSON和YAML序列化程序偶尔也会做类似的事情,修复方法是查看输出的JSON,然后提供to_json
或to_s
或to_h
处理程序, to_h
处理程序将产生最能代表数据的JSON输出。 JSON应该可以在JavaScript和后端系统之间转换,而.NET并不是提供该function的唯一语言。 Perl,Ruby,Python,谁知道有多少其他语言可以解析和发出JSON,它们都需要遵循相同的规则。