Javascript вычтет один день из строки «гггг-мм-сс» В ЧАСОВОМ ПОЯСЕ UTC

#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 . (Я бы также предложил добавить a Z в конец 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. Попробуйте отредактировать непосредственно в своем вопросе и укажите изменения для более чистого формата.