2015-05-31 2 views
2

В этом примере кода, чтобы преобразовать строку в дату:Почему .setUTCFullYear() и .setUTCMonth() возвращать разные результаты

function stringToDate(){ 
    var edate = "2015-06-01"; 
    Logger.log(edate); 
    var input = edate.split('-'); 
    var date = new Date(); 
    date.setUTCFullYear(input[0],input[1] - 1,input[2]); 
    Logger.log(date); 
} 

Logging возвращается дата «Вт Июл 01 20:07:45 GMT +01: 00 2015 », что верно, поскольку месяц« 06 »- 1 = 5 соответствует месяцу июня для этого.

Однако это почти идентична функции:

function stringToDate2(){ 
    var edate = "2015-06-01"; 
    Logger.log(edate); 
    var input = edate.split('-'); 
    var date = new Date(); 
    date.setUTCFullYear(input[0]); 
    date.setUTCMonth(input[1] - 1); 
    date.setUTCDate(input[2]); 
    Logger.log(date); 
} 

Возвращения "ср 1 июля 20:10:04 GMT + 01: 00 2015". Некоторые другие значения возвращают одинаково жуткие результаты. Почему я получаю другой результат для 'setUTCMonth', а затем для 'setUTCFullYear'?

+0

Установите переключатель UTCDate первый то UTCMonth –

+0

Но почему это решить ее? Я не понимаю, почему вам нужно будет установить день до месяца. Это кажется произвольным. – HDCerberus

ответ

3

Установите дату до месяца

date.setUTCFullYear(input[0]); 
date.setUTCDate(input[2]); 
date.setUTCMonth(input[1] - 1); 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMonth

Если параметр указывается находится за пределами ожидаемого диапазона, setUTCMonth() пытается обновить информацию даты в Date объекта соответственно. Например, если вы используете 15 для monthValue, то год будет увеличен на 1, а 3 будет использоваться в течение месяца.

Каждая из функций UTC имеет аналогичную заметку о значениях вне диапазона.

Так из-за этого:

new Date() получает текущую дату, и, таким образом, сегодня является 5/31 дата .

Есть несколько месяцев без 31-й даты, поэтому 31 вне диапазона на дату, поэтому он соответствующим образом обновляется.

Итак, если вы попытаетесь установить месяц, скажем, февраль, не меняя дату сначала, Дата будет 31.03.2015, но в феврале только 28 дней в этом году, поэтому она перевернется до 3/03/2015

И в вашем случае, если вы попытаетесь установить его на июнь, 6/31/2015, в июне никогда не было 31-й даты, поэтому он перевернется до 7/01/2015. И так далее.

Так изменить дату первого, как я показываю выше, или установить дату по умолчанию при ее создании:

new Date("01/01/2015") 
+0

Меня просто поразило, как я никогда бы не заметил этого, если бы я не тестировал его 31-го числа месяца, и как это легко могло быть незарегистрированным/незаметным в течение многих лет, и даже если бы оно было сообщено, было бы невоспроизводимым если это не было проверено в последний день месяца ... – HDCerberus

Смежные вопросы