ruby - 导出到 Excel - 如何处理时间戳?

标签 ruby excel axlsx

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

时间按预期显示为 mm/DD/YYYY HH:MM:SS,但值是 GMT 时间。

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

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

最佳答案

简答

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。此方案中没有时区,时间只是您从 watch 上读取的数字。

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

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

关于ruby - 导出到 Excel - 如何处理时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13598116/

相关文章:

ruby - 为什么安全导航比在 Rails 中使用 try 更好?

ruby - rspec测试时如何输入?

excel - 仅对一个特定列使用宏代码

excel - 打开 ADODB 连接时出现 "Unspecified error"

ruby - Axlsx gem : is it possible to apply a background color to individual cells?

ruby-on-rails - xlsx 问题 : create excel sheet with large number of rows

ruby - 从数组创建对?

excel - 索引匹配以返回最接近匹配值的相邻单元格

Ruby Axlsx 如何添加包含合并单元格的行

ruby-on-rails - rake 数据库 :setup results in fe_sendauth no password supplied