簡潔な答え
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 (エポック) からの秒数として表されます。RubyTime
オブジェクトはタイム ゾーンも保持するため、印刷したときに現地時間を表示できます。タイム ゾーンを変更すると、時刻は異なる方法で出力されますが、基になる数字は同じままです。
Excel では、タイムスタンプは 1900 年 1 月 1 日 (またはワークブックの設定によっては 1904 年) からの日数として表されます。時間は 1 日の端数として示されます。今日の日付が 41262 の場合、午前 0 時は 41262.0、正午は 41262.5 です。この方式にはタイム ゾーンはありません。時間は単に時計から読み取る数字です。
Axlsx が Ruby Time オブジェクトを Excel にエクスポートするときto_f
、エポックからの秒数で時間値を取得するために呼び出し、それを Excel が好むシリアル番号に変換するための計算を行います。すごい!しかしutc_offset
、それは .
解決策は、コード内の時刻に UTC オフセットを追加してから、Axlsx に渡すことです。たとえば、東部標準時の場合は、5 時間を差し引く必要があります。技術的には、Ruby に関する限り、作成している新しい時間オブジェクトは正しくありませんが、Excel を喜ばせるためにこれを行っているだけです。