причудливое арифметическое поведение javascript (ага ... ожидать) - PullRequest
4 голосов
/ 23 декабря 2009

хорошо, я пишу небольшой фрагмент кода, чтобы получить значение формата даты ISO для вчерашнего дня.

код:

var dateString = new Date();

var yesterday = dateString.getFullYear();

    yesterday += "-"+dateString.getMonth()+1;

    yesterday += "-"+dateString.getDate()-1;

Вышеприведенный код выводит 2009-111-23. Ясно, что dateString.getMonth () не обрабатывается как intiger и не привязывается к его концу.

Помещает ли "-" + перед dateString.getDate () приведение getDate () в строку?

эта работа дает желаемый результат.

var dateString = new Date();

var yesterday = dateString.getFullYear() + "-";

    yesterday += dateString.getMonth()+1+ "-";

    yesterday += dateString.getDate()-1;
//yesterday = 2009-12-22

Хотя мне не очень нравится, как это выглядит ... как бы то ни было.

Может кто-нибудь объяснить мне, почему javascript действует так? есть ли объяснение, почему это происходит?

Ответы [ 10 ]

13 голосов
/ 23 декабря 2009

Это примерно ассоциативность . + оператор является левоассоциативным, поэтому

"-"+dateString.getMonth() + 1

совпадает с

("-"+dateString.getMonth()) + 1

Поставьте круглые скобки вокруг выражения, которое вы хотите вычислить первым:

"-" + (dateString.getMonth() + 1)
3 голосов
/ 23 декабря 2009

Правильный способ получить значение даты, представляющее «вчера», таков:

var today = new Date();
var yesterday = new Date(today.getTime() - (1000*60*60*24));

Оттуда вы можете получить интересующие вас значения, такие как yesterday.getDate(),.

2 голосов
/ 23 декабря 2009

Это не работает. Попробуйте в первый месяц каждого месяца, и вы получите отчет "2009-12-0", как и вчера.

Попробуйте что-то вроде этого:

var mydate = new Date();
mydate.setDate(mydate.getDate()-1);
document.write(mydate.getFullYear() + "-" + (mydate.getMonth()+1) + "-" + mydate.getDate() );
1 голос
/ 23 декабря 2009

В двух словах, JavaScript слабо типизирован. Это означает, что он не определяет, является ли var текстовым или числовым до времени выполнения. Из-за этого порядок операций имеет значение. Похоже, что другие постеры говорили об ассоциативности.

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

0 голосов
/ 23 декабря 2009

Было бы более прямым получить методы даты вчерашнего дня, а не вычесть значения из сегодняшней даты.

var d = new Date();
d.setDate(d.getDate()-1); //yesterday
var isodatestring= [d.getUTCFullYear(), 
d.getUTCMonth(),d.getUTCDate()].join('-');
0 голосов
/ 23 декабря 2009

Попробуйте это:

<script type="text/javascript">
var d = new Date();
document.writeln ("Today: " + d + "<br/>Yesterday:");
d.setDate(d.getDate()-1);
document.writeln (d);
</script>

EDIT

Или это:

<script type="text/javascript">
var d = new Date();
document.writeln ("Today: " +  (d.getDate()+1) + "-" + (d.getMonth()+1) + "-" + d.getFullYear() );
d.setDate(d.getDate()-1);
document.writeln ("<br/>Yesterday: " +  (d.getDate()+1) + "-" + (d.getMonth()+1) + "-" + d.getFullYear() );
</script>
0 голосов
/ 23 декабря 2009

Как упоминает Кивели, это не сработает в первый месяц. Вместо этого получите базовое число миллисекунд с начала эпохи и вычтите ценность дня:

var dateobj = new Date();
var yesterdayms = dateobj.valueOf() - (24*60*60*1000);
var yesterdayobj = new Date(yesterdayms);
var yesterdaydatestring = yesterdayobj.getFullYear() + "-"
                        + (yesterdayobj.getMonth()+1) + "-"
                        + yesterdayobj.getDate();
0 голосов
/ 23 декабря 2009

Вы уже правильно это поняли - Javascript сначала оценивает правую часть назначения, видит символ "-" и подтверждает, что все остальное будет приведено к строковому значению.

В первом примере кода вы могли получить то, что хотели, используя скобки для предотвращения преждевременного приведения, как в:

var dateString = new Date();
var yesterday = dateString.getFullYear();
yesterday += "-" + (dateString.getMonth() + 1);
yesterday += "-" + (dateString.getDate() - 1);

Конечно, у вас все еще будет проблема, когда вы сообщаете, что дни месяца равны нулю - getDate() не индексируется с нуля. :)

0 голосов
/ 23 декабря 2009
var dateString = new Date();

var yesterday = dateString.getFullYear();

    yesterday += "-"+String(parseInt(dateString.getMonth())+1);

    yesterday += "-"+String(parseInt(dateString.getDate())-1);
0 голосов
/ 23 декабря 2009

Да, "-" + dateString.getMonth() приводится к строке, поскольку один из аргументов является строкой. Итак, когда вы добавляете 1, он просто добавляется к строке. Это не странно - так работает почти каждый динамически типизированный язык.

Использование скобок должно работать:

    yesterday += "-"+(dateString.getMonth()+1);

    yesterday += "-"+(dateString.getDate()-1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...