简答回答
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而这样做。
你如何写作excel文件?您应该确实将日期存储为双精度OLE自动化日期和Excel本机存储。这样你就不会有区域/时区问题。 – InContext
@PhilipABarnes将数据转换为整数。它似乎是通过excel正确解析到GMT时间。 – bdares