我有要写入 Excel 文件的时间对象。我正在使用 axlsx 库。将日期转换为单元格数据的类是 DateTimeConverter
,将它变成一个浮点时间戳。
时间按预期显示为 mm/DD/YYYY HH:MM:SS
,但值是 GMT 时间。
有没有办法让 Excel 为特定时区或读者本地时区设置时间格式?我目前的解决方案是将格式化的时间导出为字符串,对此我很不满意。
有没有办法不添加 VBA 宏就可以做到这一点? (请注意,根据链接的“重复”问题,我并没有尝试使用 VBA 宏将本地时间转换为 GMT,而是将 GMT 时间显示为本地时间 - 如果可能,最好不要使用 VBA 宏。)
最佳答案
简答
Excel 时间戳对时区一无所知。如果你想导出一个值并以本地时间显示它,你需要在将它发送到 Axlsx 之前将 utc_offset
添加到时间。
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。此方案中没有时区,时间只是您从 watch 上读取的数字。
当 Axlsx 将 Ruby Time 对象导出到 Excel 时,它会调用 to_f
以获取自纪元以来以秒为单位的时间值,然后进行一些数学运算将其转换为 Excel 喜欢的序列号。伟大的!但它丢弃了 utc_offset
,这就是时间在 Excel 中显示为 UTC 的原因。
解决方案是简单地将 UTC 偏移量添加到代码中的时间,然后再将它们交给 Axlsx。例如,如果您使用的是东部标准时间,则必须减去五个小时。从技术上讲,就 Ruby 而言,您正在创建的新时间对象是不正确的,但我们这样做只是为了取悦 Excel。
关于ruby - 导出到 Excel - 如何处理时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13598116/