【问题标题】:Why is Time.strptime() returning the current date?为什么 Time.strptime() 返回当前日期?
【发布时间】:2014-10-05 11:23:17
【问题描述】:

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

问题是我如何确保它做到了?

【问题讨论】:

  • 对这个的 RFC 类型有任何想法吗?
  • 很遗憾不是奥雅纳。
  • 你拥有的数字,如果从 epoch 算起的时间是 2010-01-01。如果你想从Time.strptime 获取它,你应该使用%Q%z,而不是%N%z

标签: asp.net ruby json time strptime


【解决方案1】:

使用'%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 文档有。

如果你已经解析了日期字符串,那么格式化就很容易了:

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,它们都需要遵循相同的规则。

【讨论】:

  • 我希望它返回2014-08-08 **:**:** +0200。我怎样才能确保它确实如此?
  • 你需要澄清你的意思。你想让它用'*' 掩盖时间值吗?您是否希望它反映与基于 LOCALE 的时区不同的时区?
  • 我知道 100% 肯定 1262300400000+0100 应该返回日期 2014-08-08。但由于我不知道该特定值的时间或时区,所以我将它们留空。因此*.
  • 道歉。它应该是值1406675114000+0200,它应该返回日期2014-07-30。使用Time.strptime('1406675114000+0200', '%Q%z') 可以。谢谢。
  • 干得好@theTinMan。以下是 .NET 中有关 JSON 日期的更多信息:hanselman.com/blog/…
猜你喜欢
  • 1970-01-01
  • 2016-08-03
  • 2016-05-09
  • 2017-02-08
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
相关资源
最近更新 更多