根据MDN

“日期对象基于时间值,该时间值是自1970年1月1日UTC以来的毫秒数。”

那为什么要接受负值呢?

即使负值不是1970年1月1日之前的均值也不是?

new Date('0000', '00', '-1');   // "1899-12-30T05:00:00.000Z"
new Date('0000', '00', '00');   // "1899-12-31T05:00:00.000Z"
new Date('-9999', '99', '99');  // "-009991-07-08T04:00:00.000Z"

怎么了 ?

更新

对于某些正值,该年始于1900年
new Date(100);                  // "1970-01-01T00:00:00.100Z"   // it says 100Z
new Date(0100);                 // "1970-01-01T00:00:00.064Z"   // it says 64Z
new Date("0006","06","06");     // "1906-07-06T04:00:00.000Z"

另请注意,在最后一个日期中,日期显示为4,这是错误的。

我怀疑这是某种Y2K错误?!

最佳答案


  • 日期是基于unix epoch的,因为它是defined。这是内部细节。
  • 1st Jan 1970是此基准的实际时间。
  • since是时间戳值的方向:+ ve为正向,-ve为向后。
  • 在外部,基于参数,Date构造函数有几种不同的用法:

  • 零参数=当前时间
    new Date()   // Current datetime. Every tutorial should teach this.
    



    一个数字参数=时间戳@ 1970
    new Date(0)    // 0ms from 1970-01-01T00:00:00Z.
    new Date(100)  // 100ms from 1970 baseline.
    new Date(-10)  // -10ms from 1970 baseline.
    

    一个字符串参数= iso date string
    new Date('000')        // Short years are invalid, need at least four digits.
    new Date('0000')       // 0000-01-01.  Valid because there are four digits.
    new Date('1900')       // 1900-01-01.
    new Date('1900-01-01') // Same as above.
    new Date('1900-01-01T00:00:00') // Same as above.
    new Date('-000001')    // 2 BC, see below. Yes you need all those zeros.
    

    两个或多个参数=年,月,依此类推@ 1900或0000
    new Date(0,0)      // 1900-01-01T00:00:00Z.
    new Date(0,0,1)    // Same as above.  Date is 1 based.
    new Date(0,0,0)    // 1 day before 1900 = 1899-12-31.
    new Date(0,-1)     // 1 month before 1900 = 1899-12-01.
    new Date(0,-1,0)   // 1 month and 1 day before 1900 = 1899-11-30.
    new Date(0,-1,-1)  // 1 month and *2* days before 1900 = 1899-11-29.
    new Date('0','1')  // 1900-02-01. Two+ params always cast to year and month.
    new Date(100,0)    // 0100-01-01. Year > 99 use year 0 not 1900.
    new Date(1900,0)   // 1900-01-01. Same as new Date(0,0). So intuitive!
    

    负年= BC
    new Date(-1,0)    // 1 year before 0000-01-01 = 1 year before 1 BC = 2 BC.
    new Date(-1,0,-1) // 2 days before 2 BC.  Fun, yes?  I'll leave this as an exercise.
    



    剩下的给定代码只是这些情况的变体。例如:
    new Date(0100)          // One number = epoch. 0100 (octal) = 64ms since 1970
    new Date('0100')        // One string = iso = 0100-01-01.
    new Date(-9999, 99, 99) // 9999 years before BC 1 and then add 99 months and 98 days
    

    希望您玩得开心。请不要忘记投票。 :)

    关于javascript - 为什么Date接受负值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41340836/

    10-12 02:24