为什么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_jsonto_sto_h处理程序, to_h处理程序将产生最能代表数据的JSON输出。 JSON应该可以在JavaScript和后端系统之间转换,而.NET并不是提供该function的唯一语言。 Perl,Ruby,Python,谁知道有多少其他语言可以解析和发出JSON,它们都需要遵循相同的规则。