2013-04-30 2 views
4

В последнее время я играл с JS, и я нашел что-то интересное. Это то, что я написал в хромированной консоли:Добавление/вычитание времени в JS

today = new Date() 
-> Mon Apr 29 2013 13:06:01 GMT+0200 (CEST) 
DAY = 1000 * 3600 * 24 
-> 86400000 
today - 2 * DAY 
-> 1367060761452 
today + 2 * DAY 
-> "Mon Apr 29 2013 13:06:01 GMT+0200 (CEST)172800000" 

И мне интересно, почему я получаю различные типы ответа, в зависимости от типа операции - добавление/вычитания. Когда я делаю что-то подобное:

today - (-2) * DAY 

все в порядке. Есть ли какая-то идеология, или это ошибка?

+0

Это потому, что '+' может быть добавление или оператор конкатенации, в зависимости от контекста. (Если у вас есть строковое значение и вы пытаетесь «добавить» что-нибудь к нему, второй аргумент обычно преобразуется в строку, а конкатенация происходит вместо добавления.) – CBroe

+0

Посмотрите на http://www.datejs.com/ – cirrus

ответ

1

Это немного сложно найти в спецификации, потому что это не с остальной частью Date вещи.

Если вы посмотрите на section 11.6.1, «Оператор Сложение,» вы найдете следующее примечание:

ПРИМЕЧАНИЕ 1. Нет и намека не предусмотрена в вызовах ToPrimitive в пунктах 5 и 6. Все родные объекты ECMAScript, кроме объектов Date, обрабатывают отсутствие подсказки, как если бы был указан номер подсказки; Объекты Date обрабатывают отсутствие подсказки, как если бы была указана строка подсказки. Хост-объекты могут обрабатывать отсутствие подсказки каким-либо другим способом.

В контексте это означает, что использование оператора сложения (+) с объектом Date будет использовать строковое значение, а не числовое значение. В этом смысле объекты Date являются особыми и в отличие от любых других объектов.

Обратите внимание, что такого исключения для оператора вычитания нет, так как оно однозначно — оно работает только для числового вычитания; он не работает со строками.

Также обратите внимание, что это относится к оператору сложения, + с операндами с обеих сторон. Унарный оператор «плюс» не работает так, поэтому +myDateObj без ничего с левой стороны приведет к числовому значению.

2

Для -, то есть оператор минус, используя метод .valueOf объекта даты.

В то время как для +, это сначала считается конкатенацией строк.

today - 2 * DAY считается today.valueOf() - 2 * DAY

today + 2 * DAY считается today.toString() + 2 * DAY

Итак, если вы хотите использовать математическую операцию по дате объекта, используйте today.getTime() вместо того, чтобы просто today.

3

today + 2 * DAY использует конкатенацию строк. Если вы хотите сделать это правильно, используйте today.getTime().

Пример:

tomorrow = new Date() 
tomorrow.setTime(today.getTime() + DAY) 
0

Я думаю, что складывать и вычитать дней даты яваскрипта как это

var today= new Date(); 
var addDay=30; 
today.setDate(today.getDate()+addDay); 

Сейчас сегодня указывает на следующий 30-дата с сегодняшнего дня