为什么Time.strptime()返回当前日期?

时间:2014-08-12 11:46:54

标签: asp.net ruby json time strptime

向私有(无公共文档)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

问题是如何确定它呢?

1 个答案:

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