При инициализации нового Date
объекта в JavaScript с помощью приведенного ниже вызова я обнаружил, что аргумент месяца отсчитывается, начиная с нуля.
new Date(2010, 3, 1); // that's the 1st April 2010!
Почему аргумент месяца начинается с 0? С другой стороны, аргумент дня месяца (последний) - это число от 1 до 31. Есть ли для этого веские причины?
javascript
datetime
date
Агнель Куриан
источник
источник
the Day of the week (integer)
0-6Ответы:
Это старая (вероятно, неудачная, возможно, умирающая) традиция в мире программирования, см. Старую стандартную (POSIX) функцию локального времени C http://linux.die.net/man/3/localtime
источник
Date
объект был перенесен из Java 1.0, поэтому. Унаследовав все его недостатки ... stackoverflow.com/questions/344380/…Настоящий ответ на этот вопрос заключается в том, что он был скопирован с сайта
java.util.Date
, который также имел эту причуду. Доказательство можно найти в Twitter от Брендана Эйха - парня, который изначально реализовал JavaScript (включаяDate
объект):https://twitter.com/BrendanEich/status/481939099138654209
https://twitter.com/BrendanEich/status/771006397886533632
Это произошло в 1995 году, и JDK 1.0 находился в стадии бета-тестирования. Он был запущен в 1996 году. В 1997 году вышел JDK 1.1, который устарел для подавляющего большинства функций
java.util.Date
, переместив их наjava.util.Calendar
, но даже в нем все еще оставались месяцы с нулевым отсчетом. Разработчики, которым это надоело, создали библиотеку Joda-Time , которая в конечном итоге привела кjava.time
пакету, встроенному в Java 8 (2014).Короче говоря, Java потребовалось 18 лет, чтобы получить правильно спроектированный встроенный API даты / времени, но JavaScript все еще застрял в темных веках. У нас действительно есть отличные библиотеки, такие как Moment.js , date-fns и js-joda . Но на данный момент в язык нет ничего, кроме
Date
встроенного. Надеюсь, это изменится в ближайшем будущем.источник
Все, кроме дня месяца, основано на 0, см. Полный список, включая диапазоны :)
На самом деле странными здесь являются дни с отсчетом 1 ... как ни странно. Почему это было сделано? Я не знаю ... но, вероятно, это случилось на той же встрече, которую они намазали и решили, что точка с запятой не обязательна.
источник
{ "first", "second", "third", ..., "twenty-seventh", ... }
) и попытается проиндексировать его поtm_mday
. С другой стороны, возможно, они просто увидели абсолютную полезность в том, чтобы регулярно допускать одну ошибку.В году всегда 12 месяцев, поэтому ранние реализации C могли использовать статический массив фиксированной ширины с индексами 0..11.
источник
То же самое и в java .. Вероятно, чтобы преобразовать int в строку (0 - jan ,, 1-feb), они закодировали таким образом .. потому что у них может быть массив строк (проиндексированных с 0) названий месяцев и этого месяца числа, если они начинаются с 0, будет намного проще сопоставить строки месяца ..
источник
Я знаю, что это не совсем ответ на исходный вопрос, но я просто хотел показать вам мое предпочтительное решение этой проблемы, которое я никогда не запоминаю, поскольку оно время от времени всплывает.
Небольшая функция zerofill выполняет трюк, заполняя нули там, где это необходимо, а месяц просто
+1
добавляется:Но да, у Date довольно неинтуитивный API, я смеялся, когда читал Twitter Брендана Эйха.
источник
Они могли бы считать месяцы перечислением (первый индекс равен 0), а дни - нет, поскольку с ними не было связано имя.
Или, скорее, они думали, что номер дня является фактическим представлением дня (точно так же, как месяцы представлены в виде чисел в дате, например, 31 декабря), как если бы вы могли сделать перечисление с числами в качестве переменных, но на самом деле 0 на основе.
Так что на самом деле, в течение месяцев, возможно, они думали, что правильным представлением в перечислении будет использование имени месяца вместо чисел, и они бы поступили так же, если бы дни имели представление имени. Представьте, что если бы мы произнесли 5 января, 6 января, а не 5 января, 6 января и т. Д., Тогда, возможно, они бы тоже провели нумерацию дней ...
Возможно, подсознательно они думали о перечислении месяцев как {Январь, Февраль, ...} и дней как {Один, Два, Три, ...}, за исключением дней, когда вы обращаетесь к дню как к числу, а не к имени, например, 1 для одного и т. д., поэтому невозможно начать с 0 ...
источник
Это может быть недостаток, но это также очень удобно, когда вы хотите представить месяцы или день недели в виде строки, вы можете просто создать массив вроде ['jan,' feb '... и т. Д.] [New Date () .getMonth ()] вместо ['', 'jan', feb ... и т. д.] [new Date (). getMonth ()] или ['jan', 'feb' ... и т. д.] [new Date ( ) .getMonth () - 1]
дни месяца обычно не называются, поэтому вы не будете создавать массивы с именами для них. В этом случае с 1-31 легче справиться, поэтому вам нужно каждый раз вычитать 1 ...
источник