RubyXLで日付の操作を扱った際に秒未満でズレが発生していたさいの対応
仕事で以下のようなExcelシートを読み込み日付を出力したかった際に秒未満でズレが発生した際のメモ
何が起きたか
- 以下のようなExcelシートをRubyXLで読み込みrails側で
.in_time_zone
をした際に意図した出力にならなかった(+9時間されているのはRubyXLで日付を読み込むとUTCで出力されるため一旦無視)
意図したもの
2021-02-28 22:29:51 +0900
出力されたもの
2021-02-28 22:29:50.999999782 +0900
原因
RubyXLのコードを追っていくと、時刻を記載したセルの書式設定が日付
や時刻
の場合num_to_date
というメソッドを通っていることがわかった
この処理の最後に
base_date + (dateparts[0] + (dateparts[1] * 86400).round(6) / 86400)
とあるので数値を丸めた際にズレが発生していると思われる。
対応
対応案としては以下2点が考えられる
- 書式設定が
日付
や時刻
の場合に発生するため、文字列
として扱い出力後Time.parse
などで読み込む(ハックっぽいが運用で回避)文字列
として扱うと日付を丸める処理とは別の処理になるため- https://github.com/weshatheleopard/rubyXL/blob/master/lib/rubyXL/objects/sheet_data.rb#L107
.in_time_zone.round
などで変換後丸めてしまう(今回は秒未満の数値は不要だったため)