Нужна помощь в настройке переформатированной даты

#javascript

#javascript

Вопрос:

У меня есть дата, которую я получаю из базы данных MySQL через API. Эта дата отображается в ожидаемом формате MySQL: гггг-ММ-дд. Затем я переформатирую это в ММ-дд-гггг с помощью следующего JS:

 const date = data.dateOfService;
const [year, month, day] = date.split('-');
const dateObj = {month, day, year};
value = (dateObj.month   '-'   dateObj.day   '-'   dateObj.year);
  

Где значение — это поле в form.io что выполняется вычисление / скрипт. В любом случае, проблема в том, что мне действительно нужно отобразить предыдущий день исходной даты MySQL.

 yyyy-MM-dd -1 => MM-dd-yyyy
  

Кто-нибудь знает, как к этому можно подойти? Я в тупике.

Комментарии:

1. рассмотрите возможность использования библиотеки данных.

2. К сожалению, такие библиотеки, как Moment, недоступны в form.io. Возможно, направление, в котором я пошел с моим первоначальным JS, не самый лучший маршрут.

Ответ №1:

Используйте свои year , month и day переменные для создания объекта date. Вычтите единицу из этого объекта date и перенесите ее в другой объект date. Затем используйте функции объекта date для извлечения нужной строки.

Для приведенного ниже кода полезно знать, что в javascript январь = 0.

 const date = '2020-01-01';
const [year, month, day] = date.split('-');

let dt = new Date(new Date(year, month - 1, day) - 1);

console.log(`${dt.getMonth() 1}-${dt.getDate()}-${dt.getFullYear()}`);  

Я специально выбрал 1 января. Вы можете видеть, что он корректно откатывается к 31 декабря предыдущего года.


Если вам нужно дополнить месяц и дату начальными нулями вместо однозначных цифр, то вы можете использовать padStart() . Это не так красиво, но делает свое дело:

 (dt.getMonth() 1).toString().padStart(2,0)   '-'   
dt.getDate().toString().padStart(2,0)   '-'   
dt.getFullYear();
  

Комментарии:

1. Это подводит меня ОЧЕНЬ близко. Есть простой способ добавить ноль к однозначным дням и месяцам? Таким образом, это 08-09-2020 вместо 8-9-2020.

2. Я добавил пример кода с помощью padStart() . Для краткости я не превратил это в фрагмент кода, но я протестировал его, и, похоже, он успешно дополняет сегодняшнюю дату.

Ответ №2:

Первое разделение для получения года, месяца и дня. Создайте с помощью day-1 (для вчерашнего дня) и 12 часов (для безопасности при смене дня на зимнее / летнее время) новую дату (примечание: месяцы -1, потому что JS месяцы 0-11).

Создайте для выходной строки getDate, getMonth ( 1 из-за JS 0-11) и getFullYear. Для форматирования часов и минут в виде 2 цифр добавьте перед строкой ‘0’, а затем возьмите последние 2 символа.

Вы можете попробовать, даже с изменением года или месяца проблем нет.

 function convertToYesterday(date) {
    let [year, month, day] = date.split('-');
    let yesterday = new Date(year, month-1, day-1, 12);
    return ('0' (yesterday .getMonth() 1)).slice(-2)   '-'   ('0' yesterday .getDate()).slice(-2)   '-'   yesterday .getFullYear();
}

console.log(convertToYesterday('2020-01-01'));
console.log(convertToYesterday('2020-03-01'));
console.log(convertToYesterday('2020-08-14'));  

Ответ №3:

Если вы правильно вводите значение в переменную date, вы можете использовать приведенный ниже код, чтобы получить ожидаемый результат —

 const date = '2020-01-01';
const prevDate = new Date(date);
prevDate.setDate(prevDate.getDate() - 1);

const value = ((prevDate.getMonth()   1)   '-'   prevDate.getDate()   '-'   prevDate.getFullYear());
// A better/efficient way to assign would be as follow using template literals -
// const value = `${prevDate.getMonth()   1}-${prevDate.getDate()}-${prevDate.getFullYear()}`

console.log(value);  

Использование описанного выше подхода будет работать во всех угловых случаях, например, когда исходная дата у вас является началом любого месяца или когда год является високосным. Поскольку мы используем встроенные методы даты JS, все это будет обработано Javascript.

Комментарии:

1. Я думаю, что проблема здесь в том, что она не учитывает экземпляр, где датой является 1 января 2020 года. Вычитание 1 из дня здесь не приведет к надлежащему изменению других частей объекта.

2. @tmman Проверьте правку… Я изменил используемый подход, и это должно работать нормально

3. Ваш отредактированный код отображается за два предыдущих дня, а не за один. const prevDate = new Date(date) результат уже получен за день до этого. Я не могу объяснить почему, но это так. Я, конечно, думаю, что безопаснее не создавать новый объект Date из строки.

4. @pwilcox Нет. Результат, который я получаю, всегда дает правильную дату предыдущего дня. Вы можете проверить несколько дат и сообщить мне, есть ли какие-либо ошибки

5. К сожалению, я также получаю 2 дня.

Ответ №4:

Я бы не стал использовать split, я бы использовал встроенную функцию date для выполнения преобразования, а затем просто использовал встроенные функции date для получения месяца / дня / года.

 function addN(n){return n<10? '0' n:'' n;}

const yesterday = new Date("2020-10-5");
yesterday.setDate(yesterday.getDate() - 1);
_date = addN(yesterday.getMonth() 1)   "-"   addN(yesterday.getDate())   "-"   yesterday.getFullYear()
console.log(_date)  

Ответ №5:

  var my_date_format = function (input) {
   var d = new Date(Date.parse(input.replace(/-/g, "/")));
    var month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 
     'Oct', 'Nov', Dec'];
     var date = (d.getDay() - 1).toString()   " "   
     month[d.getMonth().toString()]   ", "   
     d.getFullYear().toString();
     return (date);
  };
  

Теперь вам просто нужно вызвать эту функцию и передать дату, поступающую из databse.