【问题标题】:Exporting to Excel - What to do with timestamps?导出到 Excel - 如何处理时间戳?
【发布时间】:2012-11-28 04:59:07
【问题描述】:

我有要写入 Excel 文件的 Time 对象。我正在使用 axlsx 库。将日期转换为单元格数据的类是DateTimeConverter,它将其转换为浮点时间戳。

时间按预期显示为mm/DD/YYYY HH:MM:SS,但值是格林威治标准时间。

有没有办法让 Excel 格式化特定时区或读者当地时区的时间?我目前的解决方案是将格式化的时间导出为字符串,对此我很不满意。

有没有办法在不添加 VBA 宏的情况下做到这一点? (请注意,我没有尝试根据链接的“重复”问题使用 VBA 宏将本地时间转换为 GMT,而是将 GMT 时间显示为本地时间 - 如果可能的话,最好不使用 VBA 宏。)

【问题讨论】:

  • 你的excel文件写得怎么样?您应该真正将日期存储为 OLE 自动化日期,它是 Excel 的双精度和本机存储。这样您就不会遇到地区/时区问题。
  • @PhilipABarnes 将数据转换为整数。它似乎被 excel 正确解析为 GMT 时间。

标签: ruby excel axlsx


【解决方案1】:

简答

Excel 时间戳对时区一无所知。如果要导出一个值并以当地时间显示,则需要在发送到 Axlsx 之前将utc_offset 添加到时间。

t = ...
excel_time = Time.at(t.to_f + t.utc_offset)
sheet.add_row ["Time:", excel_time]

长答案

在 Ruby(和许多其他编程语言)中,时间戳表示为自 1970 年 1 月 1 日 00:00:00 UTC(纪元)以来的秒数。 Ruby Time 对象还保留了一个时区,因此当您将其打印出来时,它可以显示本地时间。如果更改时区,打印出来的时间会有所不同,但底层数字保持不变。

在 Excel 中,时间戳表示为自 1900 年 1 月 1 日(或 1904 年,具体取决于工作簿设置)以来的天数;时间表示为一天的一小部分。如果今天的日期是 41262,那么上午 12 点是 41262.0,中午是 41262.5。此方案中没有时区,时间只是您从手表上读出的数字。

当 Axlsx 将 Ruby Time 对象导出到 Excel 时,它会调用 to_f 以获取自纪元以来的时间值(以秒为单位),然后进行一些数学运算以将其转换为 Excel 喜欢的序列号。伟大的!但它抛弃了utc_offset,这就是为什么时间在 Excel 中显示为 UTC。

解决方案是简单地将 UTC 偏移量添加到代码中的时间,然后再将它们交给 Axlsx。例如,如果您使用的是东部标准时间,则必须减去五个小时。从技术上讲,就 Ruby 而言,您创建的新时间对象是不正确的,但我们这样做只是为了取悦 Excel。

【讨论】:

  • 所以你说 Excel 没有时区的概念。多么令人失望。
  • 如果你使用 Rails,你可以像这样使用to_s(:db)User.last.created_at.to_s(:db)
  • 仅供参考 - axlsx (2.0.0) 的下一个版本将自动调整序列化值以包含时区偏移量。我们中的许多人对此感到沮丧,并认为如果 axlsx 为您处理添加(或减去)任何偏移量会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 2020-11-19
  • 2017-12-09
  • 1970-01-01
相关资源
最近更新 更多