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

时间:2012-11-28 04:59:07

标签: ruby excel axlsx

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

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

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

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

1 个答案:

答案 0 :(得分:6)

简短回答

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

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。

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