日付オブジェクトを、Googleスプレッドシートで使用されている日付の基になる値と一致する「シリアル番号」に変換したいと思います。私の理解では、Javascriptでは、日付オブジェクトの基本的な値は、1970年1月1日の真夜中から(または前に)ミリ秒数です。Googleスプレッドシートでは、1899年12月30日の深夜の日付の基本値は0(ゼロ)であり、それ以降は毎日1になります(たとえば、7時間は7を24で割った値になります)。
私はこの関数を試しました:
function date2Serial(date) {
return (date.getTime() + 2209161600000) / 86400000;
// 2209161600000 = milliseconds between 1899-12-30 and 1970-01-01
// 86400000 = milliseconds in a day
// question "on the side" - is there any essential difference between
// .getTime() and .valueOf()?
}
そして、これは少しずれた値を返します-そして「ずれ」はGMTとの私のタイムゾーンの違いに対応していると思います。したがって、私の場合、スプレッドシート設定とプロジェクトプロパティの両方がGMT + 10に設定されていても、getTime()はGMTで動作しているようです。
したがって、たとえば:
A1: 16/09/2012 06:00:00
A2: =date2serial(A1)
A3: =VALUE(A1)
A2は41167.8333を返し、A3は41168.25を返します。
ここで、getTimezoneOffset()メソッドを使用してみましたが、問題が修正されたようです。
function date2Serial(date) {
return (date.getTime() + 2209161600000 - (date.getTimezoneOffset() * 60000)) / 86400000;
}
ただし、これは、スプレッドシート設定のタイムゾーンではなく、プロジェクトプロパティのタイムゾーンが正しいことに依存しています(実際には、これらをそれぞれ異なる方法で設定することができます)。
私の質問:
この動作は予想され、タイムゾーンの「調整」は必要ですか?または、getTime()(およびgetHours()、getMinutes()などの他のすべてのメソッド)はGMT / UTCではなくユーザーの設定されたタイムゾーンで動作する必要があり、「調整」は実際にはバグの回避策ですか?