1

私は次のコードを持っています:

var date = new Date(2010,09,09); //09.10.2010 00:00
date.setHours(-1); //sets the date to 08.10.2010 23:00

通話date.setHours(-1);により、日付は前日の23:00に設定されます(少なくともOperaとChromeの場合)。

これは合法ですか?

4

3 に答える 3

4

合法であるだけでなく、必須でもあります。

この動作は、ECMAScript 仕様のセクション 15.9.5.34で公式に定義されています。

Date.prototype.setHours (時間 [, 分 [, 秒 [, ミリ秒] ] )

minが指定されていない場合、 minが value で指定されているかのように動作しますgetMinutes()

secが指定されていない場合、値でsecが指定されているかのように動作しますgetSeconds()

msが指定されていない場合、これはmsが value で指定されているかのように動作しますgetMilliseconds()

  1. tをLocalTime (この時間値) の結果とする。
  2. hをToNumber (時間) とします。
  3. minが指定されていない場合は、 mを MinFromTime( t ) とします。それ以外の場合は、mを ToNumber( min ) とします。
  4. secが指定されていない場合、 sを SecFromTime( t ) とします。それ以外の場合は、 sを ToNumber( sec ) とします。
  5. msが指定されていない場合は、 milliを msFromTime( t ) とします。それ以外の場合は、milliを ToNumber( ms ) とします。
  6. 日付をMakeDate (Day( t ), MakeTime( h , m , s , milli )) とする。
  7. uをTimeClip (UTC(日付)) とします。
  8. この Date オブジェクトの [[PrimitiveValue]] 内部プロパティをuに設定します。
  9. あなたを返す

そして、MakeTimeステップ 6 で使用される の仕様は、最終的に、さまざまな部分を乗算することによってミリ秒のオフセットを計算します。引数の境界には (有限であることを除いて) 前提条件がないため、負の時間数は正当であり、負の結果になります。

したがって、全体的な結果、つまり真夜中 + (-1 時間) は、仕様に準拠するために前日の 23:00 である必要があります。

于 2012-08-17T12:14:06.237 に答える
2

はい、これは事実上仕様で規定されていることなので、そうでない場合は「違法な」実装になります。

実際の計算はで行われMakeDateます。日付は-1時間と同様に、ミリ秒に変換されます。次に、これらが追加されます。負の数を加算すると減算が行われるため、より早い日付が得られます。

dayが有限でないか、が有限でない場合はtime、を返しNaNます。

戻り値day× msPerDay+ time

于 2012-08-17T12:10:40.700 に答える
1

弁護士に合法性を求めてください。しかし、あなたはしたいかもしれません:

date.setHours(date.getHours()-1);

それを正しくするために-あなたが期待したように。

たぶんそれを指摘する価値がありsetDate(-1)、あなたが期待するように動作setMonth(-1)setYear(-1) ないでください。

于 2012-08-17T12:10:39.037 に答える