2012-11-28 14 views
2

我有写到Excel文件的Time对象。我正在使用axlsx库。将日期转换为单元格数据的类是DateTimeConverter,它将其转换为浮点时间戳。导出到Excel - 如何处理时间戳?

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

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

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

+0

你如何写作excel文件?您应该确实将日期存储为双精度OLE自动化日期和Excel本机存储。这样你就不会有区域/时区问题。 – InContext

+0

@PhilipABarnes将数据转换为整数。它似乎是通过excel正确解析到GMT时间。 – bdares

回答

5

简答回答

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,这就是为什么时间在UTC中出现在Excel中。

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

+0

所以你说Excel没有时区的概念。多么令人失望。 – bdares

+0

如果你使用的是Rails,你可以像这样使用'to_s(:db)':'User.last.created_at.to_s(:db)' –

+2

FYI - 下一个版本的axlsx(2.0.0)将自动调整seraialized的值包括时区偏移量。我们中的许多人都对此感到沮丧,并且认为如果axlsx为您添加(或减去)任何偏移量会更好。 – randym