#javascript #node.js #date #timezone
#javascript #node.js #Дата #Часовой пояс
Вопрос:
У меня есть строка для даты UTC var latestDate='2020-11-17'
, и я пытаюсь получить дату предыдущих дней из этой строки в новую переменную var subtractedDate;
.
Итак, моя цель — получить subtractedDate=2020-11-16
var latestDate='2020-11-17';
//convert to iso date string
var dateStr = new Date(latestDate).toISOString();
console.log('dateStr=', dateStr);
//subtract a day
//ERROR OCCURS HERE, has trouble running // var subtractedDate = dateStr.setDate(('2020-11-17T00:00:00.000Z').getDate()-1);, something with how I have '2020-11-17T00:00:00.000Z' formatted?
var subtractedDate = dateStr.setDate(dateStr.getDate()-1);
console.log('subtractedDate = ', subtractedDate);
Я пытаюсь использовать ('2020-11-17T00:00:00.000Z').getDate()-1
для вычитания дня из метки даты и времени, но это приводит к ошибке: Uncaught TypeError: dateStr.getDate is not a function
Комментарии:
1. Вы просто вводите неправильную переменную
var exDateMinusDay = exDate;
. Ваш результат вdateStr
, а неexDate
. (Я бы также предложил добавить aZ
в конецexDate
при его разборе, напримерvar dateStr = new Date(exDate "Z");
. Согласно спецификации, он должен быть проанализирован в UTC, но спецификация немного изменилась между ES2015 и ES2018, и некоторые устаревшие браузеры могут читать его как местное время вместо этого безZ
.)2. это не строка даты, это объект даты, и:
date.setDate(date.getDate() - 1);
должно работать. Просто вы печатаете не то, что нужно… Кроме того, пожалуйста, не используйтеvar
, у нас теперь естьlet
иconst
которые являются предпочтительными!3. По состоянию на ваше редактирование, исправляющее проблему, на которую я указал выше, она работает. В чем вопрос?
4. отредактированный мой вопрос, фрагмент кода работает да, но когда я запускаю его локально в node.js проект, он улавливает мой местный часовой пояс
5. @Martin — Согласно спецификации, ваш код правильный и использует UTC, но см. Мой Первый комментарий выше — возможно, лучше добавить a
Z
при синтаксическом анализе, чтобы быть уверенным. (toISOString
всегда использует UTC.)
Ответ №1:
Мы должны иметь возможность использовать Date.parse, чтобы получить количество миллисекунд с 1 января 1970 года, 00:00:00 UTC, затем вычтите миллисекунды на 1 день (24 60 60*1000 ), чтобы получить время unix на один день раньше.
Затем мы можем использовать Date.toLocaleTimeString для его форматирования.
const latestDate='2020-11-17';
// Get the number of milliseconds since 1970-1-1, then subtract 1 day (24*60*60*1000 milliseconds)
const dt = new Date(Date.parse(latestDate) - 24*60*60*1000);
// Format an ISO-8601 date in the UTC timezone
const subtractedDate = dt.toLocaleDateString('sv', { timeZone: 'UTC' });
console.log({ latestDate, subtractedDate })
Ответ №2:
Пожалуйста, попробуйте сделать следующее.
dateStr.setDate(dateStr.getDate()-1);
var dateStr = new Date();
var month = dateStr.getUTCMonth() 1; //months from 1-12
var day = dateStr.getUTCDate();
var year = dateStr.getUTCFullYear();
newdate = year "/" month "/" day;
Комментарии:
1. только что обновил мой вопрос, в моем кодовом блоке был небольшой тип, пример кода здесь выполняется правильно, но когда я запускаю его локально, он выбирает мой часовой пояс (см. Мой Отредактированный вопрос)
2. var month = dateStr.getUTCMonth() 1; // месяцы от 1-12 var day = dateStr.getUTCDate(); var year = dateStr.getUTCFullYear(); exDate = год «/» месяц «/» день;
3. Попробуйте отредактировать непосредственно в своем вопросе и укажите изменения для более чистого формата.