5

Excel ファイルに書き込んでいる Time オブジェクトがあります。axlsx ライブラリを使用しています。日付をセル データに変換するクラスはDateTimeConverterで、浮動小数点のタイムスタンプに変換します。

時刻は期待どおりに表示されmm/DD/YYYY HH:MM:SSますが、値は GMT 時間です。

特定のタイム ゾーン、またはリーダーのローカル タイム ゾーンの時刻を Excel 形式にする方法はありますか? 私の現在の解決策は、フォーマットされた時間を文字列としてエクスポートすることですが、これには不満があります。

VBA マクロを追加せずにこれを行う方法はありますか? (リンクされた「重複」の質問に従って、VBAマクロを使用して現地時間をGMTに変換しようとしているのではなく、GMT時間を現地時間に表示しようとしていることに注意してください-できればVBAマクロを使用しないでください。)

4

1 に答える 1

5

簡潔な答え

Excel のタイムスタンプは、タイム ゾーンについて何も知りません。値をエクスポートして現地時間で表示する場合は、utc_offsetAxlsx に送信する前に時刻に を追加する必要があります。

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 を喜ばせるためにこれを行っているだけです。

于 2012-12-20T00:06:35.677 に答える