【问题标题】:Parse DateTime when given as a Number/Double以数字/双精度形式给出时解析 DateTime
【发布时间】:2014-07-16 23:13:27
【问题描述】:

我正在处理一些来自天气硬件的日期时间,这些硬件记录到 .dbf 文件中。我可以从我正在使用的 ruby​​ 脚本/网络服务器中提取它,但我得到了诸如

之类的数字

41836.532638889

我不确定日期时间是如何表示的,因此很难知道如何解析它。我最好用 Ruby 来解析它,所以代码会更好,但如果我知道它是如何表示的,我可以弄清楚如何去做。

【问题讨论】:

  • 我很好奇这个数字是什么意思,但它与 Ruby 无关。我倾向于联系硬件制造商以获取相关文档。
  • 如何从 dbf 文件中获取 41836.532638889 值? dbf 日期时间字段不存储为浮点数。
  • 我正在使用 dbf 解析 gem。当我在 LibreOffice 中打开文件时(说明说 dbf 是 excel 可读的,但是看到我在 linux 上,libreoffice 是第二好的选择),它也有那个时间格式。可能值得补充的是,最早的记录可以追溯到不超过一年,可能更短,大约是 30,000。我最好的猜测是 Y 日期之后 X 天/小时/等,只是不知道 X 和 Y 是什么

标签: ruby date datetime time dbf


【解决方案1】:

日期是 Excel 中常见的 OLE 自动化格式日期。正如谷歌所说的那样

An OLE Automation date is implemented as a floating-point number whose integral component is the number of days before or after midnight, 30 December 1899, and whose fractional component represents the time on that day divided by 24.

对应的Ruby代码是

def self.convert_time(t)
  Time.at((t - 25569) * 86400).utc
end

减法将时间转移到 unix 时间开始的那一天(1970 年 1 月 1 日)。 Unix 时间以秒为单位,因此将天转换为秒:24*60*60=86400。为方便起见,转换为 UTC 时间。

【讨论】:

    【解决方案2】:

    试试 Time.at(your_number/double)。然后,您可以根据需要对其进行格式化。

    Time.at(41836.532638889)
    => 1970-01-01 12:37:16 +0100
    

    【讨论】:

    • 不幸的是,我认为这没有给出正确的时间(即今天 2014 年 7 月 16 日的某个时间)。数据可以追溯到几个月前,达到了 30,000 多个。所以我不认为它从它自己的时间开始的秒数(以及读取它的原始软件正确解析时间)也不是从纪元开始的秒数(这是 Time.at 所做的)。
    【解决方案3】:

    41836 - 从 1899 年 12 月 31 日(零日期)起经过的天数,532638889 - 从所提及日期的午夜起经过的秒数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 2012-10-21
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多