Why does the month argument range from 0 to 11 in JavaScript's Date constructor?

后端 未结 8 1063
生来不讨喜
生来不讨喜 2020-11-22 15:31

When initializing a new Date object in JavaScript using the below call, I found out that the month argument counts starting from zero.

new Date(         


        
相关标签:
8条回答
  • 2020-11-22 15:50

    Its like this in java too.. Probably to convert int to string (0 - jan,, 1-feb), they coded this way.. because they might have an array of string (indexed from 0) of month names and these month numbers if they start from 0, it'll be lot easier to map to the month strings..

    0 讨论(0)
  • 2020-11-22 15:52

    Everything but the day of the month is 0 based, see here for a full list including ranges :)

    It's actually the 1 based days that are the oddballs here...oddly enough. Why was this was done? I don't know...but probably happened the same meeting they got plastered and decided semicolons were optional.

    0 讨论(0)
  • 2020-11-22 15:54

    The real answer to this question, is that it was copied from java.util.Date, which also had this quirk. Proof can be found on Twitter from Brendan Eich - the guy who originally implemented JavaScript (including the Date object):

    https://twitter.com/BrendanEich/status/481939099138654209

    https://twitter.com/BrendanEich/status/771006397886533632

    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. Developers fed-up with this created the Joda-Time library, which ultimately led to java.time package that's baked in to Java 8 (2014).

    In short, it took 18 years for Java to get a correctly designed date/time API built-in, but JavaScript is still stuck back in the dark ages. We do indeed have excellent libraries like Moment.js, date-fns, and js-joda. But as of now, there is nothing more than Date built-in to the language. Hopefully this will change in the near future.

    0 讨论(0)
  • 2020-11-22 15:56

    There are always 12 months in a year, so early C implementations might have used a static fixed-width array with indexes 0..11.

    0 讨论(0)
  • 2020-11-22 15:58

    It's an old (probably unfortunate, probably dying) tradition in the programming world, see the old standard (POSIX) localtime C function http://linux.die.net/man/3/localtime

    0 讨论(0)
  • 2020-11-22 16:10

    It might be a flaw, but it's also very handy when you want to represent the months or day of the week as a string you can just create an array like ['jan,'feb' ...etc][new Date().getMonth()] in stead of ['','jan',feb ...etc][new Date().getMonth()] or ['jan','feb' ...etc][new Date().getMonth()-1]

    days of the month are normaly not named so you won't be making arrays with names for those. In this case 1-31 is easier to handle, so you want have to subtract 1 every time...

    0 讨论(0)
提交回复
热议问题