Подтвердить что ты не робот

JavaScript getDate возвращает неверную дату

Следующий script возвращает 20 вместо 21!

var d = new Date("2010/03/21");
document.write(d.getDate());

Что я делаю неправильно? Является ли это ошибкой JavaScript?

4b9b3361

Ответ 1

Метод Date.parse зависит от реализации (new Date(string)эквивалентно Date.parse(string)).

Хотя этот формат будет доступен в современных браузерах, вы не можете быть на 100% уверены, что браузер будет интерпретировать именно ваш желаемый формат.

Я бы рекомендовал вам манипулировать вашей строкой и использовать конструктор Date с аргументами year, month и day:

// parse a date in yyyy-mm-dd format
function parseDate(input) {
  var parts = input.match(/(\d+)/g);
  // new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]])
  return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based
}

Ответ 2

Это проблема с летним временем, потому что Дата() использует локальное время.

Я живу в Бразилии, а 21 октября - начало летнего времени в большей части моей страны, поэтому локальные даты на 21 октября между 0: 0 и 1: 0 в Бразилии не существуют!

Некоторые люди комментируют здесь, что он работает. Это происходит потому, что правильный или неправильный возврат часа зависит от страны локального пользователя.

Смотрите: http://www.timeanddate.com/news/time/brazil-dst-2012.html

В Бразилии в 2012 году Java думает, что DST начинается с 14 октября (на самом деле это начинается через неделю)

var dt = new Date(2012,9,14); 
alert(dt.getHours());

создает 1 и

Смотрите: http://www.timeanddate.com/time/dst/2013.html

В решении используется время UTC (скоординированное универсальное время), потому что нет изменений на летнее время, и вы используете своеобразное абстрактное время. В большинстве практических приложений нет проблем.

var dt = new Date( Date.UTC(2012, 9, 21, 8, 5, 12));
alert( (dt.getUTCMonth()+1) + '/' + dt.getUTCDate() + '/' + 
        dt.getUTCFullYear() + " " + dt.getUTCHours()+ ':' + 
        dt.getUTCMinutes() + ':' + dt.getUTCSeconds() );

это проще, если кто-то не использует часы, минуты и секунды, просто поместите значение фиктивного часа больше или равно 1, как я показал выше.

Ответ 3

Есть ли вероятность, что он обрабатывает строковый аргумент как UTC и результирующий объект Date как локальное время, или наоборот? Это может отбросить его. Сравните d.getDate() с d.getUTCDate().

Ответ 4

Я также получаю отклонение 1 день через getDate(), но я отмечаю, что getUTCDate() возвращает ожидаемое значение. Проблема была замечена в FF 3.6.12, но тот же код, что и в Chrome, был в порядке.

Мой код отладки:

var date="2010-11-04";
alert(date);
var d = new Date(date)
alert(d.toDateString()+": "+ d.getDate()+" UTC "+d.getUTCDate());

Это дало результат (FireFox):

Ср 03 ноя 2010: 3 UTC 4

Chrome в порядке. Так что-то где-то где-то - возможно, ошибка, но, скорее, проблема с часовым поясом /UTC. Напоминает мне, где дата PHP() вернет 23 часа в день, если часовой пояс изменится в этот день и т.д. Буксируется, если я знаю, что это такое.

Ответ 5

Я написал следующий код в адресной строке браузера, и результат был 21

javascript:alert(new Date("2010/03/21").getDate())

Нет такой вещи, как ошибка Javascript, так как существует много реализаций Javascript, поэтому вы захотите обратиться к конкретной реализации.

Я тестировал реализацию Chrome 4.1.249. Что твой?

Ответ 6

Я тестировал этот код в Firefox 3.6 и IE 8:

<script type="text/javascript">

var d = new Date("2010/03/21");
document.write(d.getDate());

</script> 

Показывает правильную дату: 21

Для получения дополнительной информации смотрите: Объект JavaScript JavaScript

Вы также можете прочитать о соображениях совместимости JavaScript в Википедии.

Ответ 7

http://jsbin.com/aqoki3/edit - здесь с кодом, который вы отправили, я получаю 21. Так что это не ошибка JS. Возможно, его ошибка в вашей реализации браузера (JS).
Поэтому для правильной инициализации даты var используйте new Date(year, month, date [, hour, minute, second, millisecond ]) (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Date). Таким образом, вы будете уверены, что день 21, потому что вы неявно устанавливаете его в 21.

Ответ 8

Я получаю ту же дату (21) в firfox, safari, chrome, opera и IE, я использую строку "2010/03/21" или целые аргументы даты (2010,2,21).

Я использую Windows-машину и новые версии браузеров -

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

if(new Date("2010/03/21")- new Date(2010,2,21)){
alert(new Date("2010/03/21"));
} 

Ответ 9

Убедитесь, что месяц, который вы используете, равен -1. Если вы смотрите на июнь, вам нужно сделать (6-1) в течение месяца, когда создайте

   var date_obj = new Date(y,(m-1),d);

Ответ 10

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

new Date('2017-07-31T10:00:00-0500');

Ответ 11

Вы не можете создать объект Date, передав строковый аргумент, показанный как дата.

Создайте вот так.

var str_date = "2010/03/21";
var date = new Date();
var date_elements = str_date.split("/");

date.setYear(date_elements[0]);
date.setMonth(date_elements[1]);
date.setDay(date_elements[2]);

alert(date.toString);

обратите внимание на метод date.toString. он возвращает полную дату String. date.getDate даст вам только день этого дня.

для получения дополнительной информации о объекте Date, см. www.w3school.com