2

日付オブジェクトを、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ではなくユーザーの設定されたタイムゾーンで動作する必要があり、「調整」は実際にはバグの回避策ですか?

4

2 に答える 2

2

getTime()は、瞬間ではなく期間を返すため、タイムゾーンはありません。差し引く基準となる瞬間は、1970年1月1日(UTC)の真夜中です。

getHours()、getMinutes()などのメソッドは、ある瞬間の一部を提供します。結果は、使用される日付オブジェクトのタイムゾーンによって異なります。日付オブジェクトのタイムゾーンから独立したい場合は、getUTCHours()、getUTCMinutes()などを使用する必要があります。

于 2012-09-17T07:19:30.527 に答える
0

このコードは、ローカルの夏も考慮に入れます。正しくするには、Dateオブジェクトを2回作成する必要があるため、少し非効率的です。

function ValueToDate(GoogleDateValue) {
  var d = Date.UTC(1899,11,30,0,0,0)+(GoogleDateValue*86400000) ;
  return new Date(d+(new Date(d)).getTimezoneOffset()*60000) ;
}

function DateToValue(date) {
  return (date.getTime()-date.getTimezoneOffset()*60000)/86400000+25569 ;
}
于 2020-06-07T11:59:29.627 に答える