#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.