2012-08-17 101 views
1

我有以下代碼:date.setHours(-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

前一日(至少對於Opera和Chrome瀏覽器)調用date.setHours(-1);設定日期至23:00。

這合法嗎?

+0

你是什麼意思與「這是合法的」? – 2012-08-17 12:08:44

+0

這與猜測完全相同。如果我在第二天,一小時前的0:00時,那是第一天23:00。所以對我來說,這似乎是完全合法的。 – 2012-08-17 12:09:06

回答

2

是的,這實際上是規範要求的,所以如果沒有,這將是一個「非法」實現。

實際計算髮生在MakeDate。日期轉換爲毫秒,-1小時也是如此。然後添加這些。添加一個負數做減法,所以你得到一個更早的日期。

如果day不是有限的或者time不是有限的,則返回NaN

返回day×msPerDay + time

4

它不僅是合法的,它是要求

的行爲在ECMAScript specification正式定義,節15.9.5.34:

Date.prototype.setHours(小時[,分鐘,秒[,毫秒]]])

如果沒有指定分鐘,則表現得好像分鐘被指定爲值getMinutes()

如果未指定,則此行爲如同用值getSeconds()指定。

如果MS未指定,這個行爲就好像毫秒用價值getMilliseconds()規定。

  1. t是LocalTime(此時間值)的結果。
  2. h爲ToNumber(小時)。
  3. 如果未指定分鐘,那麼讓是MinFromTime();否則,讓m爲ToNumber(分鐘)。
  4. 如果未指定,那麼讓小號是SecFromTime();否則,讓ToDumber()。
  5. 如果未指定毫秒,那麼讓是msFromTime();否則,讓milli爲ToNumber(ms)。
  6. 日期是MAKEDATE(日(),MAKETIME(ħ小號))。
  7. ü是TimeClip(UTC(日期))。
  8. 將此Date對象的[[PrimitiveValue]]內部屬性設置爲
  9. 返回ù

和說明書用於MakeTime,在步驟6中使用的,最終計算毫秒通過各部分相乘偏移。對於爭論的界限沒有先決條件(除了它們是有限的),所以負數小時是合法的,並且會導致負面結果。

因此,整體結果,即午夜+(-1小時),確實需要在前一天的23:00才能符合規範。