Ответ 1
Это сводится к тому, как Date.parse()
обрабатывает формат даты ISO-8601.
Строка времени даты может быть в формате ISO 8601. Например, "2011-10-10" (только дата) или "2011-10-10T14: 48: 00" (дата и время) могут быть переданы и проанализированы. Часовой пояс UTC используется для интерпретации аргументов в формате ISO 8601, которые не содержат информацию о часовом поясе (обратите внимание, что проект ECMAScript ed 6 указывает, что строки времени даты без часового пояса должны рассматриваться как локальные, а не UTC)
Ваш первый формат даты 2015/03/31
предполагается до 31 марта 2015 года в 12 часов в вашем текущем часовом поясе.
Ваш второй формат даты 2015-03-31
рассматривается как ISO-8601 и предполагается, что он будет 31 марта 2015 года в 12 часовом поясе UTC.
Заголовок "Различия в предполагаемом часовом поясе" из связанной документации немного подробнее:
С учетом строки даты "7 марта 2014 года" parse() принимает локальный часовой пояс, но с учетом формата ISO, такого как "2014-03-07", он примет часовой пояс UTC. Поэтому объекты Date, созданные с использованием этих строк, будут представлять разные моменты времени, если система не установлена с местным часовым поясом UTC. Это означает, что две строки дат, которые выглядят эквивалентными, могут приводить к двум различным значениям в зависимости от формата преобразуемой строки (это поведение изменяется в ECMAScript ed 6, так что оба будут считаться локальными).