Следующий script возвращает 20 вместо 21!
var d = new Date("2010/03/21");
document.write(d.getDate());
Что я делаю неправильно? Является ли это ошибкой JavaScript?
Следующий script возвращает 20 вместо 21!
var d = new Date("2010/03/21");
document.write(d.getDate());
Что я делаю неправильно? Является ли это ошибкой JavaScript?
Метод 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
}
Это проблема с летним временем, потому что Дата() использует локальное время.
Я живу в Бразилии, а 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, как я показал выше.
Есть ли вероятность, что он обрабатывает строковый аргумент как UTC и результирующий объект Date
как локальное время, или наоборот? Это может отбросить его. Сравните d.getDate()
с d.getUTCDate()
.
Я также получаю отклонение 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 часа в день, если часовой пояс изменится в этот день и т.д. Буксируется, если я знаю, что это такое.
Я написал следующий код в адресной строке браузера, и результат был 21
javascript:alert(new Date("2010/03/21").getDate())
Нет такой вещи, как ошибка Javascript, так как существует много реализаций Javascript, поэтому вы захотите обратиться к конкретной реализации.
Я тестировал реализацию Chrome 4.1.249. Что твой?
Я тестировал этот код в 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 в Википедии.
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.
Я получаю ту же дату (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"));
}
Убедитесь, что месяц, который вы используете, равен -1. Если вы смотрите на июнь, вам нужно сделать (6-1) в течение месяца, когда создайте
var date_obj = new Date(y,(m-1),d);
При присвоении новой дате строковой даты строка должна включать часовой пояс, иначе она будет интерпретироваться иначе, чем браузер, в другую (из-за различных реализаций javascript) и от машины к другой (из-за разницы локального часового пояса )
new Date('2017-07-31T10:00:00-0500');
Вы не можете создать объект 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