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

3 ruby excel axlsx

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

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

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

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

ben*_*ado 5

简短的回答

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

t = ...
excel_time = Time.at(t.to_f + t.utc_offset)
sheet.add_row ["Time:", excel_time]
Run Code Online (Sandbox Code Playgroud)

答案很长

在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.

  • 仅供参考 - axlsx(2.0.0)的下一版本将自动调整seraialized值以包括时区偏移量.我们中的许多人都对此感到沮丧,并相信如果axlsx处理为您添加(或减去)任何偏移量会更好. (2认同)