1 (изменено: alexii, 2012-06-04 00:56:49)

Тема: JScript: new date.getMonth() возвращает неправильный месяц

Толи я чего-то недопонимаю, то ли у WSH есть некий "трабл", я бы даже сказал баг.

У меня возникла необходимость поработать с объектом Date,  для чего я обратился к справке из первоисточника:вот здесь.

Ну и собственно поехали:


var Today = new Date()
WScript.Echo(Today.getMonth())

Мне кто ни будь может объяснить почему - ПЯТЬ !!!! июнь вроде как ШЕСТОЙ месяц !!!!

При этом, системный календарь - выставлен верно... и более того


var Today = new Date()
WScript.Echo(Today.getDate())
WScript.Echo(Today.getFullYear())

возвращают правильные дату и год соотвественно
Я сначала было не поверил, но проверил на трех системах
Windows Server 2003 R2, Windows XP Pro SP3, Windows 7 Pro SP2...
везде одно и тоже !
Люди добрые, проверьте пожалуйста, а то я в каком-то недоумении.

Ничто не помогает писать код больше чем Stevie Ray Vaughan And Double Trouble в наушниках.

2

Re: JScript: new date.getMonth() возвращает неправильный месяц

RUVATA, я исправил заголовок и поправил Ваш пост. Вы не в чате, пишите внятно и по-русски.

для чего я обратился к справке из первоисточника:вот здесь.

Во-первых, Вы выбрали не тот источник.

Download: Windows Script 5.6 Documentation - Microsoft Download Center - Download Details:

The getMonth method returns an integer between 0 and 11 indicating the month value in the Date object. The integer returned is not the traditional number used to indicate the month. It is one less. If "Jan 5, 1996 08:47:00" is stored in a Date object, getMonth returns 0.

Во-вторых, и по Вашей ссылке ясно сказано аналогичное:

Метод getMonth возвращает целое число в диапазоне от 0 до 11, которое указывает значение месяца из объекта Date. Возвращаемое целое число не является традиционным номером месяца. Оно на единицу меньше. Так, если в объекте Date сохранено значение "5 января 1996 г. 08:47:00,0", метод getMonth возвращает значение 0.

3

Re: JScript: new date.getMonth() возвращает неправильный месяц

RUVATA пишет:

Мне кто ни будь может объяснить почему - ПЯТЬ !!!! июнь вроде как ШЕСТОЙ месяц !!!!

Сейчас стало очень модно давать ссылку на справку, не читая её .

MSDN пишет:

Метод getMonth возвращает целое число в диапазоне от 0 до 11, которое указывает значение месяца из объекта Date. Возвращаемое целое число не является традиционным номером месяца. Оно на единицу меньше. Так, если в объекте Date сохранено значение "5 января 1996 г. 08:47:00,0", метод getMonth возвращает значение 0.

4 (изменено: alexii, 2012-06-04 01:44:45)

Re: JScript: new date.getMonth() возвращает неправильный месяц

Модератор, убей пожалуйста тему. Я уже всё вычитал. Каюсь, поторопился.

Но я все равно в шоке! Зачем?! Я уже даже побаиваюсь лезть дальше в WSH. Это блин офигенные грабли, прямо таки в тривиальных вещах, что же там глубже?

Там нет случайно функции, которая выполняет сложение двух чисел - где Возвращаемая сумма не является традиционной суммой. Она больше на два, поделена на шесть, и возведена в степень первого аргумента.

Ничто не помогает писать код больше чем Stevie Ray Vaughan And Double Trouble в наушниках.

5

Re: JScript: new date.getMonth() возвращает неправильный месяц

RUVATA, к WSH сие не имеет никакого отношения; таков стандарт.

Модератор, убей пожалуйста тему...

я уже всё вычитал... каюсь, поторопился...

Пусть останется на память. Я вновь отредактировал Ваш пост. Обратите внимание, как он стал выглядеть теперь. Жду от Вас того же.

6

Re: JScript: new date.getMonth() возвращает неправильный месяц

RUVATA, начинать отсчёт с нуля- это нормальная практика в программировании. Причём в JScript и VBScript массивы начинаются именно с нуля. С практической точки зрения- время хранится как число секунд, прошедших с определённого момента(обычно 01.01.1970) и текущий месяц, в конечном итоге, получается как остаток от целочисленного деления на 12.

7 (изменено: RUVATA, 2012-06-04 11:55:48)

Re: JScript: new date.getMonth() возвращает неправильный месяц

Александр_,

начинать отсчет с нуля это нормальная практика в программировании

- так и есть, с этим никто не спорит.
А по поводу массивов, не могу припомнить ни одного языка где бы это было не так, разве что в VB/VBA сталкивался, где специальная инструкция Option Base 1 задает нижнюю границу массива принудительно.
Ну так почему-же тогда дата *.getDate() - возвращает правильный день месяца... ну так и делали бы тогда и даты от НУЛЯ

alexii,

Жду от Вас того же.

извините не могу редактировать Ваши комментарии

Ничто не помогает писать код больше чем Stevie Ray Vaughan And Double Trouble в наушниках.

8

Re: JScript: new date.getMonth() возвращает неправильный месяц

RUVATA пишет:

ну так и делали бы тогда и даты от НУЛЯ

Date.getDate() - определенное число
Date.getMonth() - всего лишь индекс.
Например:

var months = 'Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь'.split(' ');

var now = new Date();
var m = now.getMonth();

alert(months[m]);
( 2 * b ) || ! ( 2 * b )

9

Re: JScript: new date.getMonth() возвращает неправильный месяц

Rumata пишет:

Date.getDate() - определенное число
Date.getMonth() - всего лишь индекс.
Например:

var months = 'Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь'.split(' ');

var now = new Date();
var m = now.getMonth();

alert(months[m]);

Когда я переходил с VBS на JScript тоже наступил на эти грабли.
До сих пор для меня это загадка - почему Date.getMonth() возвращает некий мифический индекс вместо номера месяца?
Ни в одном языке такого не встречал - да вот хотя бы как в VBS:

WScript.Echo Month(Now)

10 (изменено: RUVATA, 2012-06-04 22:31:37)

Re: JScript: new date.getMonth() возвращает неправильный месяц

Slav, спасибо, спасибо, спасибо !
наконец-то хоть один человек признал что это грабли
В С++/Qt/GTK, Python во всех ипостасиях, JavaScript/Node.js, Ruby, AutoIt, ну везде где я только встречал встроенные средства для работы с текущей системной датой и временем, нигде не было подобного, если есть функция возвращающая текущий месяц, то она возвращает его из расчета 1-12,
и пусть там "за кулисами" общепринятый в программировании отсчет от нуля, на выход они выдают уже обработанный вариант, если надо +1, значит +1 делается "за кулисами". Зачем эти грабли подложили пользователю в WSH, для меня остается загадкой.
Отсюда закономерный вопрос:
Есть ли еще нечто подобное в Windows Scripting ? (в смысле такие вот не очевидные грабли)
Хотелось бы знать заранее.

Ничто не помогает писать код больше чем Stevie Ray Vaughan And Double Trouble в наушниках.

11

Re: JScript: new date.getMonth() возвращает неправильный месяц

RUVATA пишет:

это грабли

грабли != баги

На самом деле такое ошеломляет, но к этому надо привыкнуть. Также как многим программистов ошеломляют "неудобная" и бессистемная логика именования функций, например в vbs или php. Но таков стандарт языка. И всего лишь.

RUVATA пишет:

нечто подобное в Windows Scripting ?

проведите границу между WSH и JS и определите - где именно Вы готовитесь встретить неочевидное. (-:

( 2 * b ) || ! ( 2 * b )

12

Re: JScript: new date.getMonth() возвращает неправильный месяц

RUVATA пишет:

В С++/Qt/GTK, Python во всех ипостасиях, JavaScript/Node.js, Ruby, AutoIt, ну везде где я только встречал встроенные средства для работы с текущей системной датой и временем, нигде не было подобного, если есть функция возвращающая текущий месяц, то она возвращает его из расчета 1-12

ЛПП! В C++ все индексы идут с нуля(пруф), а QT и GTK это вообще не языки программирования. Индекс месяца не предназначен для прямого вывода на экран, так же как индекс дня недели, для этого должны быть специальные функции.

13 (изменено: Slav, 2012-06-05 10:03:56)

Re: JScript: new date.getMonth() возвращает неправильный месяц

Александр_ пишет:

...В C++ все индексы идут с нуля(пруф)...

Александр_,

ну почему же все - а как же:

tm_mday day of the month 1-31

В последнем посте, коллега, Вы употребили слово "индекс" 3 раза.
Если я правильно понимаю, то это "индексы" в неких массивах - в каких именно?
Ну где конкретно описан, например, массив месяцев - в С++ или в JScript?
Куда этот "индекс" "вставить"?


Александр_ пишет:

...Индекс месяца не предназначен для прямого вывода на экран, так же как индекс дня недели, для этого должны быть специальные функции.

Этот "индекс" вообще ни для чего "не предназначен" - ладно на экран, его и в расчетах использовать тоже нельзя.

Я согласен с коллегой Rumata - "...к этому надо привыкнуть"

Опять же сошлюсь на привычный на этом форуме VBS:
The Weekday function returns a number between 1 and 7, that represents the day of the week.

И никаких "специальных функций"

14 (изменено: RUVATA, 2012-06-05 13:28:12)

Re: JScript: new date.getMonth() возвращает неправильный месяц

Александр,

а QT и GTK это вообще не языки программирования

А я разве назвал их языками программирования ? Это часто встречающееся у программистов способ указания на сочетание языка и конкретного фреймворка, или среды программирования, первым пишут непосредственно язык, а поттом через "/" фреймворки, среды, технологии, окружения и т.д.
C++(язык)/Qt (фреймворк) / GTK (фреймворк)
JavaScript(язык)/Node.JS(технология, окружение-интерпритация)

В C++ все индексы идут с нуля

Где я вам сказал что там индексы не идут с нуля ?! вы читаете через слово? (или даже через два)
Я сказал:

В С++/Qt/GTK, Python во всех ипостасиях, JavaScript/Node.js, Ruby, AutoIt, ну везде где я только встречал встроенные средства для работы с текущей системной датой и временем, нигде не было подобного, если есть функция возвращающая текущий месяц, то она возвращает его из расчета 1-12,
и пусть там "за кулисами" общепринятый в программировании отсчет от нуля, на выход они выдают уже обработанный вариант, если надо +1, значит +1 делается "за кулисами"

и еще ранее

А по поводу массивов, не могу припомнить ни одного языка где бы это было не так, разве что в VB/VBA сталкивался, где специальная инструкция Option Base 1 задает нижнюю границу массива принудительно.

где вы тут нашли ЛЛП ?

Наверное я тоже соглашусь с ...

Я согласен с коллегой Rumata - "...к этому надо привыкнуть"

а по поводу

проведите границу между WSH и JS и определите

мы как раз с вами разговариваем о технологии Windows Scripting, и доступных для языка JScript (который семантически - JavaScript), через COM/OLE/ActiveX объекты... разница не в языке, а в окружении, и меня интересуют соответственно грабли в этом самом окружении, встроенных и часто используемых подключаемых объектах, их методах и свойствах. Ведь этот самый объект : Date, я так понял это даже не из .Net Framework, это откуда-то из самого движка WSH
(путь дотнетовцы поправят меня, но в .Net Framework работа с текущей системной датой реализована через System.DateTime, и там собственно все иначе)

Ничто не помогает писать код больше чем Stevie Ray Vaughan And Double Trouble в наушниках.

15 (изменено: Александр_, 2012-06-05 14:19:14)

Re: JScript: new date.getMonth() возвращает неправильный месяц

Slav пишет:

ну почему же все - а как же:

tm_mday day of the month 1-31

См. пост 8.

Slav пишет:

В последнем посте, коллега, Вы употребили слово "индекс" 3 раза.
Если я правильно понимаю, то это "индексы" в неких массивах - в каких именно?
Ну где конкретно описан, например, массив месяцев - в С++ или в JScript?
Куда этот "индекс" "вставить"?

Произвольный массив, создать вы его должны сами, месяцы обозвать как угодно и первый месяц будет иметь индекс 0.

Slav пишет:

Этот "индекс" вообще ни для чего "не предназначен" - ладно на экран, его и в расчетах использовать тоже нельзя.

Это шутка?

RUVATA пишет:

А я разве назвал их языками программирования ? Это часто встречающееся у программистов способ указания на сочетание языка и конкретного фреймворка, или среды программирования, первым пишут непосредственно язык, а поттом через "/" фреймворки, среды, технологии, окружения и т.д.

Раньше не сталкивался с таким обозначением, учту.

RUVATA пишет:

Где я вам сказал что там индексы не идут с нуля ?! вы читаете через слово? (или даже через два)

А где я писал, что вы писали, что индексы не идут с нуля? вы читаете через слово? (или даже через два)?

RUVATA пишет:

где вы тут нашли ЛЛП ?

Тут нету, есть там:

RUVATA пишет:

В С++/Qt/GTK, Python во всех ипостасиях, JavaScript/Node.js, Ruby, AutoIt, ну везде где я только встречал встроенные средства для работы с текущей системной датой и временем, нигде не было подобного, если есть функция возвращающая текущий месяц, то она возвращает его из расчета 1-12

В C++ индекс первого месяца равен нулю. Достаточно разжевал? Самое смешное, что ту фразу, которую привели вы я вообще не цитировал .

16 (изменено: Slav, 2012-06-05 15:35:48)

Re: JScript: new date.getMonth() возвращает неправильный месяц

Александр_ пишет:

...
Произвольный массив, создать вы его должны сами, месяцы обозвать как угодно и первый месяц будет иметь индекс 0.
...

Александр_,

ну если уж это "произвольный массив" и месяцы я могу называть как угодно - то дайте мне возможность произвольно определять и само количество этих месяцев.
Пусть первый индекс будет 0, а почему последний 11 ?
Это - шутка.

Если серьезно - то подобные обсуждения полезны тем, что анализ "граблей-багов-фич" позволяет самому не повторять подобного.
Как хотите - но я считаю подобный пример на JScript логически противоречивым.
Смириться с фактом я готов, но пытаться объяснить это логически - не могу!

var ss01 = "7/20/1996";

var dd = new Date(); 
dd.setTime(Date.parse(ss01)); 

var ss02 = " -> " + dd.getMonth() + "/" + dd.getDate() + "/" + dd.getFullYear();

WScript.Echo(ss01 + ss02);

17

Re: JScript: new date.getMonth() возвращает неправильный месяц

Slav пишет:

Как хотите - но я считаю подобный пример на JScript логически противоречивым

Коллега, Вы правы. Единственное оправдание этому я нахожу только в том, что это индекс мифического массива названий месяцев. И то, это мое лчное оправдание, которое нужно ну чтобы хоть как-то объяснить такую логику.

И кстати, коллеги! Эта "багофича" особенность не JScript, но JavaScript, которые оба суть реализации ECMAScript. Стандарт языка такой. К WSH это никакого отношения не имеет.

( 2 * b ) || ! ( 2 * b )

18

Re: JScript: new date.getMonth() возвращает неправильный месяц

Rumata, спасибо... Действительно, таков стандарт ECMA...
(я когда курил стандарт, совсем не обратил на это внимание, ну меня правда тогда даты особо не интересовали)
Зря это мы на WSH наехали

что это индекс мифического массива названий месяцев. И то, это мое лчное оправдание, которое нужно ну чтобы хоть как-то объяснить такую логику.

Так и есть, это прямо таки проистекает из стандарта:

Значение месяца, равное 0, обозначает январь; 1 - февраль; 2 - март; 3 - апрель; 4 - май; 5 - июнь; 6 - июль; 7 - август; 8 - сентябрь; 9 - октябрь; 10 - ноябрь; 11 - декабрь.

я думаю, что так было сделано из соображений, возможной необходимости обработки даты в текстовом представлении, предполагаю это в силу того, что "номер дня" (т.е. дата) согласно стандарту это целое число от 1 до 31 ,но вот уже "день недели" представляется в виде от 0-7 где 0 - это воскресенье, ну и 7 - соответственно суббота. Поскольку день недели и месяц это те величины которые довольно часто имеют текстовое представление, или же имеется необходимость их в таком виде предоставлять, в отличии от традиционного дня месяца (даты). Хотя мое предположение предписывает наличие функционала, который такое текстовое представление возвращает, что-то типа getDateStr(), которое вместо индекса 0 (январь), к примеру, возвращало бы строку "January" - это бы точно объясняло зачем, и почему, но нет.

Ничто не помогает писать код больше чем Stevie Ray Vaughan And Double Trouble в наушниках.

19

Re: JScript: new date.getMonth() возвращает неправильный месяц

RUVATA пишет:

но вот уже "день недели" представляется в виде от 0-7 где 0 - это воскресенье, ну и 7 - соответственно суббота

сорри, не мог не заметить, что от 0 до 6, хотя...

20

Re: JScript: new date.getMonth() возвращает неправильный месяц

Буквально на днях, работал с датой в Perl:

perldoc -f localtime

       localtime EXPR
       localtime
               Converts a time as returned by the time function to a 9-element
               list with the time analyzed for the local time zone.  Typically
               used as follows:

                   #  0    1    2     3     4    5     6     7     8
                   ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
                                                               localtime(time);

               All list elements are numeric, and come straight out of the C
               `struct tm'.  $sec, $min, and $hour are the seconds, minutes,
               and hours of the specified time.

               $mday is the day of the month, and $mon is the month itself, in
               the range 0..11 with 0 indicating January and 11 indicating
               December.  This makes it easy to get a month name from a list
:

                   my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
                   print "$abbr[$mon] $mday";
                   # $mon=9, $mday=18 gives "Oct 18". . .
. . .
               $wday is the day of the week, with 0 indicating Sunday and 3
               indicating Wednesday.
  $yday is the day of the year, in the
               range 0..364 (or 0..365 in leap years.)
. . .

Краткий пересказ. $mon это месяц, число в интервале 0..11, где 0 - январь, 11 - декабрь. Это удобно и упрощает получение имени месяца из списка. Там же показан и пример.

Аналогично для дней недели.

Все весьма логично.

( 2 * b ) || ! ( 2 * b )