Lesson4

プログラミングとか読書とか日常のログ

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というメソッドを通っていることがわかった

github.com

この処理の最後に

base_date + (dateparts[0] + (dateparts[1] * 86400).round(6) / 86400)

とあるので数値を丸めた際にズレが発生していると思われる。

対応

対応案としては以下2点が考えられる

  • 書式設定が日付時刻の場合に発生するため、文字列として扱い出力後Time.parseなどで読み込む(ハックっぽいが運用で回避)
  • .in_time_zone.roundなどで変換後丸めてしまう(今回は秒未満の数値は不要だったため)