Как получить дату следующего дня в JS в формате ГГГГ-ММ-ДД? - PullRequest
0 голосов
/ 19 февраля 2020

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

В принципе, если у меня есть дата, подобная следующей:

2018-04-06

Я хочу иметь возможность получить дату следующего дня следующим образом:

2018-04-07

Я нашел следующий фрагмент кода на SO для этого (вида):

var date = new Date('2018-04-06');
date.setDate(date + 1);

Проблема в том, что я получаю дату обратно с настроенным часовым поясом, и, поскольку я нахожусь в часовом поясе США по восточному времени, это дает мне эту дату минус пять часов, что фактически совпадает с днем, когда я начал.

Я просматривал бесчисленные сообщения SO, пытаясь найти ответ на этот, казалось бы, простой вопрос, но для любой конкретной даты, независимо от того, в каком часовом поясе находится пользователь, как я могу получить дату следующего дня в YYYY-MM -DD ​​формат? Спасибо.

Ответы [ 4 ]

3 голосов
/ 19 февраля 2020

Строки в формате YYYY-MM-DD анализируются как UT C, поэтому в этом случае все делают в UT C (см. Почему Date.parse дает неверные результаты? и Как добавить 1 день к текущей дате? ).

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

let s = '2018-04-06';
let d = new Date(s);
d.setUTCDate(d.getUTCDate() + 1);
console.log(d.toISOString().substr(0,10));
0 голосов
/ 19 февраля 2020

Как было предложено @chrisbyte, пытались ли вы использовать toUTCString метод вместо из toString() метода?

В качестве напоминания, toString - это значение по умолчанию, используемое при отображении объекта date в консоли, например

Я думаю, что «проблема», которую вы предполагаете, заключается в неполном понимании поведения Date.toString() метода: этот метод кажется чтобы вернуть строку, представляющую Date объект , но , кажется, использует часовой пояс, как упомянуто здесь (в комментарии в 1-м примере)

Здесь мой фрагмент, чтобы понять больше :

  const originalDate = new Date('2018-04-06');
    // retrieving the original timestamp
    const originalTimestamp = originalDate.valueOf()
    
    // displaying the original date (non UTC / UTC)
    console.log(`original date (timezone dependent): ${originalDate.toString()}`)
        console.log(`original date (timezone independent): ${originalDate.toUTCString()}`)

    // we add one more day
    originalDate.setDate(originalDate.getDate() +1)
    const dayAfterTimestamp = originalDate.valueOf()
    
   // displaying the original date (non UTC / UTC)
    console.log(`updated date (timezone dependent): ${originalDate.toString()}`)
        console.log(`updated date (timezone independent): ${originalDate.toUTCString()}`)

    // check the differences (in milliseconds)
    console.log(`difference: ${(dayAfterTimestamp-originalTimestamp)}`)
    
    
       // displaying the original format (timezone independent)

Наконец, если вы хотите вернуть строку даты в формате YYYY-MM-DD, вам может потребоваться реализовать ее самостоятельно: - /, или использовать toLocaleFormat метод, но он не стандартизирован.

0 голосов
/ 19 февраля 2020

Лог c будет означать добавление 24 часов в миллисекундах к текущему времени. Например:

var myDate = new Date();
var oneMoreDay = new Date();
oneMoreDay.setTime(myDate.getTime() + 86400000);
console.log(myDate.getDate());
console.log(oneMoreDay.getDate());

В переменную oneMoreDay добавлен дополнительный день. В вашем конкретном примере c вы просто хотели добавить еще один день в переменную ORIGINAL, поэтому я бы сделал что-то вроде:

date.setTime(date.getTime() + 86400000);
0 голосов
/ 19 февраля 2020

Вы пробовали с датой UT C?

var date = new Date('2018-04-06');
console.log(date.toUTCString());

date.setDate(date.getDate() + 1);
console.log(date.toUTCString());
...