V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
longjiahui
V2EX  ›  JavaScript

为什么 new Date().getMonth()返回 0-11

  •  
  •   longjiahui · 2020-04-11 16:11:34 +08:00 · 4733 次点击
    这是一个创建于 1688 天前的主题,其中的信息可能已经有所发展或是发生改变。

    js 或 某些库,返回月份要用 0-11.

    很迷惑啊喂😂

    第 1 条附言  ·  2020-04-11 20:17:53 +08:00
    啊 感谢科普 确实外国不说 1 月 2 月,
    还有 getYear 也是 😂
    每次用的时候 都要 先输出验证一下 有点麻烦。问完问题之后 感觉我现在印象变深了。
    第 2 条附言  ·  2020-04-11 20:19:38 +08:00
    我刚毕业做了一段时间 java,那时候就是 用到过 Date 。
    啊,所以从头到尾迷惑的原因是一致的。
    23 条回复    2020-04-12 14:14:47 +08:00
    longjiahui
        1
    longjiahui  
    OP
       2020-04-11 16:13:07 +08:00
    new Date().getDate() 返回了 1-31
    cmdOptionKana
        2
    cmdOptionKana  
       2020-04-11 16:36:56 +08:00   ❤️ 8
    http://www.ccued.com/post/43.html

    有一种看似十分说的通的民间解释:

    因其它如年,日,时,分,秒都是数字,所以从 1 开始没什么问题。然而月份是有英文名称的 January 、February...,它们存于数组中["January","February",...],所以是从 0 开始就说的通了
    yisiyisi
        3
    yisiyisi  
       2020-04-11 16:37:42 +08:00
    因为数组是从 0 开始的,便于对应每一个月份名字。
    ["January", "February", "March", "April", "May", "June", "July","August", "September", "October", "November", "December"]
    而日期一般是没有对应的名字的。
    azh7138m
        4
    azh7138m  
       2020-04-11 16:56:08 +08:00 via Android
    tldr
    抄的 Java

    > This happened in 1995, and JDK 1.0 was in beta. It launched in 1996. In 1997, JDK 1.1 came out which deprecated the vast majority of functions on java.util.Date, moving them over to java.util.Calendar, but even that still had zero-based months.

    详见
    https://stackoverflow.com/questions/2552483/why-does-the-month-argument-range-from-0-to-11-in-javascripts-date-constructor
    https://twitter.com/BrendanEich/status/481939099138654209
    dorentus
        5
    dorentus  
       2020-04-11 17:27:35 +08:00 via iPhone
    考虑到 September, October, November, December 分别是七月、八月、九月、十月的意思,你就明白了,他们的普通人并没有汉语或日语母语者那么强的月份和顺序数字对应的意识。
    xzh654321
        6
    xzh654321  
       2020-04-11 17:42:09 +08:00
    Brendan Eich 解释过,早起他有很多很糟糕的想法……
    littlewing
        7
    littlewing  
       2020-04-11 17:57:07 +08:00
    国外不说 1 月 2 月 3 月... 而是 January,February,March ...
    可能是这样吧
    JerryCha
        8
    JerryCha  
       2020-04-11 17:58:07 +08:00
    小伙子,这就是 JavaScript 啊

    @littlewing 西方按数字算也是 1-12 的。0-11 这是计算机的 convention 。
    dangyuluo
        9
    dangyuluo  
       2020-04-11 17:58:20 +08:00
    这是 feature, feature
    dangyuluo
        10
    dangyuluo  
       2020-04-11 17:58:59 +08:00
    @littlewing 美国也用 12/25/2019 这种日期记法
    arthas2234
        11
    arthas2234  
       2020-04-11 18:13:40 +08:00
    这个就是设计者的锅,但是已经普及开来了,改也改不了了
    egfegdfr
        12
    egfegdfr  
       2020-04-11 18:39:56 +08:00
    涨知识了~~~
    GuuJiang
        13
    GuuJiang  
       2020-04-11 18:52:04 +08:00 via iPhone
    @dorentus 你说的这个是历史原因,罗马历里只有十个月,后来的历法在前面插了两个月,而这几个月的名字顺延了下来,这个例子反而恰恰佐证了英语的月份也是从 1 开始的
    yujiff
        14
    yujiff  
       2020-04-11 21:17:30 +08:00
    @dorentus “考虑到 September, October, November, December 分别是七月、八月、九月、十月的意思” 不对吧?
    murmur
        15
    murmur  
       2020-04-11 21:20:07 +08:00
    这就是 js 的 feature,记住就行,面试也可能当个考点
    charlieputon
        16
    charlieputon  
       2020-04-11 21:46:04 +08:00 via Android
    @yujiff xswl 。。。
    zhanglintc
        17
    zhanglintc  
       2020-04-11 21:57:17 +08:00
    @yujiff #14 September 和 November 不确定, 不过你看前缀, Octo- 和 Dec- 还真就分别表示 "八, 八倍", "十, 十倍". 我记得是历法中, 是出现了一次硬插入了两个月还是什么情况, 导致全部后退了两个月, 所以本来表示"八"的 October 成了十月, 表示"十"的 December 变成了十二月
    hantsy
        18
    hantsy  
       2020-04-11 21:58:38 +08:00
    基本所有的类 C 语言都是这么处理的,和 Index 相关都是从 0 开始。
    Java 就 JDBC 比较变态,参数位置从 1 开始,其它好像记得都是 0 开始。
    noobma
        19
    noobma  
       2020-04-11 22:26:03 +08:00
    那 getDay 是 0-6 又咋说呢😂
    christin
        20
    christin  
       2020-04-12 00:51:09 +08:00 via iPhone
    @cmdOptionKana 学到了学到了 感谢
    christin
        21
    christin  
       2020-04-12 00:52:13 +08:00 via iPhone
    @noobma 和月份一样 星期几有特定的名称
    skinny
        22
    skinny  
       2020-04-12 09:10:14 +08:00
    其实就是错误的或者说糟糕的设计,因为有特定名称数组这个理由太牵强,你从 1 开始,用 Map 存不是更符合直觉更贴近实际情况吗?
    DOLLOR
        23
    DOLLOR  
       2020-04-12 14:14:47 +08:00 via Android
    这特性是 js 从 java 继承来的,那就得问问为啥 java 要这么做了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4697 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:05 · PVG 12:05 · LAX 20:05 · JFK 23:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.