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

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

时间显示为mm/DD/YYYY HH:MM:SS如预期的那样,但是这些值是GMT时间。

有没有办法让Excel格式化一个特定的时区,或读者的本地时区? 我目前的解决scheme是将格式化的时间作为string导出,我对此不满意。

有没有办法做到这一点,而不添加VBAmacros? (请注意,我并没有试图将本地时间转换为格林威治标准时间格式,而是根据链接的“重复”问题,而是将GMT时间显示为本地时间 – 如果可能,最好不使用VBAmacros。

简短的回答

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。 这个scheme中没有时区,时间就是你读的一个数字。

当Axlsx将一个Ruby Time对象导出到Excel中时,它将调用to_f来获取自该纪元以来的秒数,然后执行一些math运算,将其转换为Excel所喜欢的序列号。 大! 但它丢掉了utc_offset ,这就是为什么时间在UTC中出现在Excel中。

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