JavaScript getDate возвращает неверную дату - PullRequest
43 голосов
/ 21 марта 2010

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

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

Что я делаю не так? Это ошибка JavaScript?

Ответы [ 12 ]

52 голосов
/ 21 марта 2010

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

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

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

// 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
}
29 голосов
/ 07 февраля 2013

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

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

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

См .: http://www.timeanddate.com/news/time/brazil-dst-2012.html

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

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, как я показал выше.

15 голосов
/ 21 марта 2010

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

4 голосов
/ 23 ноября 2010

Я также получаю отклонение от одного дня до 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):

Ср. 3 ноября 2010 г .: 3 UTC 4

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

2 голосов
/ 21 марта 2010

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

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

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

Реализованная мною реализация была Chrome 4.1.249. Что у тебя?

1 голос
/ 27 июня 2018

Это часовой пояс, который играет главную роль здесь. Функция Date() добавит ваш часовой пояс к дате, которую вы вводите. Например: я дал такой ввод:

alert(new Date("2018-09-15"));

Результат для меня: Сб 15 сентября 2018 05:30:00 GMT + 0530 (стандартное время Индии)

Часовой пояс +05:30 добавляется к времени моего ввода (вы можете видеть на приведенном выше результате. 05: 30: 00 добавляется к дате. Теперь я говорю, что вы находитесь в часовом поясе менее 0 [такие страны, как Бразилия, Мексика, Чили и т. д., имеющие часовой пояс менее 0], то это добавит к вашему вводу даты (например: часовой пояс UTC-05: 00. Он вычтет -5: 00 из дата дана.

VahidN , вы получили результат 20, потому что вы находитесь в часовом поясе меньше 0 (-1è : 00` и ​​т. Д.)

Решение сбросить часовой пояс на 0 . Как это:
Дата ( "2010-03-21T00: 00: 00")

.
1 голос
/ 21 марта 2010

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

<script type="text/javascript">

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

</script> 

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

Для получения дополнительной информации, смотрите: JavaScript Date Object

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

0 голосов
/ 03 августа 2017

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

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

вместо

new Date('2017-07-31T10:00:00');
0 голосов
/ 28 февраля 2014

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

   var date_obj = new Date(y,(m-1),d);
0 голосов
/ 22 марта 2010

Я получаю ту же дату (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"));
} 
...