Даты Javascript выходной?

Я пытаюсь использовать в своем приложении простую функцию даты, чтобы передать дату в формате yyyy-mm-dd, например 2017-07-30, и вернуть ее в формате 07/30/2017.

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

function format(inputDate) {
    var date = new Date(inputDate);
    if (!isNaN(date.getTime())) {
        var day = date.getDate().toString();
        var month = (date.getMonth() + 1).toString();
        // Months use 0 index.

        return (month[1] ? month : '0' + month[0]) + '/' +
           (day[1] ? day : '0' + day[0]) + '/' + 
           date.getFullYear();
    }
}

console.log(format('2017-07-30'));

Вот скрипка: http://jsfiddle.net/49pptrj4/

Есть мысли относительно того, почему это возвращается неправильно?

Результат с моей стороны:

введите описание изображения здесь


person SBB    schedule 31.07.2017    source источник
comment
результат кажется правильным во фрагменте   -  person Dij    schedule 31.07.2017
comment
ваш jsfiddle / фрагмент кода работает правильно   -  person Bdloul    schedule 31.07.2017
comment
Когда я пытаюсь: -?   -  person Sherlocked Nguyen    schedule 31.07.2017
comment
может быть проблема с часовым поясом?   -  person Jaromanda X    schedule 31.07.2017
comment
Обновлено со скриншотом.   -  person SBB    schedule 31.07.2017
comment
нельзя просто добавить +1, чтобы дата была правильной?   -  person cup_of    schedule 31.07.2017
comment
Попробуйте отладить. Что console.log(new Date('2017-07-30')) производит в вашем браузере?   -  person Phil    schedule 31.07.2017
comment
@cup_of - Я уверен, что смогу, но теперь мне любопытно, почему это работает для других.   -  person SBB    schedule 31.07.2017
comment
new Date ('2017-07-31') возвращает 2017-07-31T00:00:00Z - если вы находитесь к западу от GMT, это соответствует некоторому времени 30 июля - попробуйте вместо этого использовать getUTCDate getUTCMonth и getUTCYear   -  person Jaromanda X    schedule 31.07.2017
comment
@Phil Sat Jul 29 2017 17:00:00 GMT-0700 (PDT)   -  person SBB    schedule 31.07.2017
comment
Ну конечно. @JaromandaX указал на проблему здесь. Из документов ~ поддержки для форматов ISO 8601 отличается тем, что строки только с датой (например, 1970-01-01) обрабатываются как UTC, а не как локальные.   -  person Phil    schedule 31.07.2017
comment
Ах, милый, спасибо за сотрудничество, все, что, казалось, все исправило.   -  person SBB    schedule 31.07.2017
comment
или добавьте T00:00:00 к inputDate var date = new Date(inputDate+'T00:00:00'); - в Firefox это рассматривается как ЛОКАЛЬНОЕ время   -  person Jaromanda X    schedule 31.07.2017


Ответы (1)


Из здесь

Учитывая строку даты «7 марта 2014», [Date.] Parse () предполагает местный часовой пояс, но с учетом формата ISO, такого как «2014-03-07», он будет использовать часовой пояс в формате UTC.

Строка даты предполагается равной 0:00 или полуночи даты, указанной в формате UTC, часовом поясе Гринвича, Англия. Однако ваш браузер использует это время и преобразует его в ваш местный часовой пояс, который на несколько часов отстает от UTC, если вы находитесь в Северной и Южной Америке, в результате чего результат отстает на день.

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

utcDate = new Date("2017-07-30"); //Date object a day behind
new Date(utcDate.getTime() + utcDate.getTimezoneOffset() * 60000) //local Date

Здесь местная дата создается путем добавления времени на основе разницы часовых поясов. getTimezoneOffset() возвращается через минуты, поэтому * 60000 необходимо преобразовать в миллисекунды.

Это может не сработать в регионах, опережающих всемирное координированное время; это может продвинуться на дополнительный день. Изменить: только что проверено, а getTimezoneOffset() отрицательно в областях перед UTC, поэтому время будет правильно вычитаться.

person Matthias    schedule 31.07.2017
comment
На этот вопрос уже много раз отвечали. - person RobG; 31.07.2017