JavaScript для изменения формата и значения input type="date"

Этот вопрос может быть немного сложным:

Как использовать JavaScript для изменения формата ввода type="date" на: ГГГГ-ММ-ДД, и независимо от того, какую дату выберет пользователь, дату всегда нужно преобразовать в последний день месяца.

Например, если пользователь выбирает 2023-06-01, то в финале дата должна быть:

2023-06-30

<!DOCTYPE html>
<html lang = "en" dir = "ltr">
  <head>
    <meta charset = "utf-8">
    <title>Test</title>
  </head>
  <style media = "screen">
  .form-question {
    display: flex;
    flex-direction: column;
    justify-content: center;
    margin: 0 0 3rem;
    min-height: 3rem;
  }
  .form-question__title {
    color: #342357;
    font-size: 1.5rem;
    padding: 1rem;
  }
  .input-container {
    border-bottom: solid 2px #333333;
  }
  .input-container input {
    border: none;
    box-sizing: border-box;
    outline: 0;
    padding: .75rem;
    width: 100%;
  }
  </style>
  <body>
    <div class = "form-question">
      <div class = "form-question__title">
        <span>Effective Date</span>
      </div>
      <div class = "input-container">
        <input id = "effective-date" type = "date" name = "effective-date" minlength = "1" maxlength = "64" placeholder = " " autocomplete = "nope" required = "required"></input>
        <span class = "bar"></span>
      </div>
    </div>
  </body>
</html>

Любой друг может помочь?

Я вижу, вы предоставили дизайн, но где ваша попытка заставить его работать?

imvain2 13.04.2023 22:35

Получите дату, добавьте один месяц, установите день на 0.

Emiel Zuurbier 13.04.2023 22:41

@ imvain2 это слишком сложно, я даже понятия не имею.

William 13.04.2023 23:04

вы хотите изменить формат в пользовательском интерфейсе stackoverflow.com/questions/7372038/…

cmgchess 13.04.2023 23:09

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

imvain2 13.04.2023 23:14

@ imvain2 Я устал менять формат в теге html в пользовательском интерфейсе, это не сработало, поэтому я прошу решение для JavaScript

William 13.04.2023 23:15

@imvain2 если у вас нет понимания или идеи, пожалуйста, просто игнорируйте этот вопрос, спасибо

William 13.04.2023 23:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
7
226
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Основываясь на этой идее, вы можете попробовать это:

document.querySelector('#effective-date').addEventListener('change',(e)=>{
  let date = new Date(e.target.value);
  date = (new Date(new Date(date.setMonth(date.getMonth() + 1)).setDate(0))).toJSON().split('T')[0];
  console.info(date);
});
<!DOCTYPE html>
<html lang = "en" dir = "ltr">
  <head>
    <meta charset = "utf-8">
    <title>Test</title>
  </head>
  <style media = "screen">
  .form-question {
    display: flex;
    flex-direction: column;
    justify-content: center;
    margin: 0 0 3rem;
    min-height: 3rem;
  }
  .form-question__title {
    color: #342357;
    font-size: 1.5rem;
    padding: 1rem;
  }
  .input-container {
    border-bottom: solid 2px #333333;
  }
  .input-container input {
    border: none;
    box-sizing: border-box;
    outline: 0;
    padding: .75rem;
    width: 100%;
  }
  </style>
  <body>
    <div class = "form-question">
      <div class = "form-question__title">
        <span>Effective Date</span>
      </div>
      <div class = "input-container">
        <input id = "effective-date" type = "date" name = "effective-date" minlength = "1" maxlength = "64" placeholder = " " autocomplete = "nope" required = "required" />
        <span class = "bar"></span>
      </div>
    </div>
  </body>
</html>
Ответ принят как подходящий

Чтобы получить последний день месяца, вы можете перейти к следующему месяцу, с дня 0 до Date() он должен вернуться к последнему дню предыдущего месяца. Чтобы отформатировать дату, вы можете использовать toLocaleDateString со шведской локалью. Чтобы отобразить его в пользовательском интерфейсе, вы можете создать диапазон наложения, который покрывает исходный ввод.

const el = document.getElementById('effective-date');
const displayEl = document.querySelector('.date-display');

el.addEventListener('input', function(event) {
  const selectedDate = new Date(el.value);
  const lastDayDate = new Date(selectedDate.getFullYear(), selectedDate.getMonth() + 1, 0);
  const options = { year: 'numeric', month: '2-digit', day: '2-digit' };
  const formattedDate = lastDayDate.toLocaleDateString('se-SE', options);
  displayEl.textContent = formattedDate;
});
  .form-question {
    display: flex;
    flex-direction: column;
    justify-content: center;
    margin: 0 0 3rem;
    min-height: 3rem;
  }
  .form-question__title {
    color: #342357;
    font-size: 1.5rem;
    padding: 1rem;
  }
  .input-container {
    border-bottom: solid 2px #333333;
  }
  .input-container input {
    border: none;
    box-sizing: border-box;
    outline: 0;
    padding: .75rem;
    width: 100%;
  }

.date-container{
  position:relative;
}
.date-display{
  font-family:sans-serif;
  display:block;
  position:absolute;
  top:0;
  bottom:0;
  font-size:12px;
  line-height:12px;
  padding:15px 5px;
  width:calc(100% - 50px);
 background:white;
}
<div class = "form-question">
  <div class = "form-question__title">
    <span>Effective Date</span>
  </div>
  <div class = "input-container">
    <div class = "date-container">
      <input id = "effective-date" class = "effective-date" type = "date" name = "effective-date" minlength = "1" maxlength = "64" placeholder = " " autocomplete = "nope" required = "required">
      <span class = "date-display">YYYY-MM-DD</span>
    </div>
    <span class = "bar"></span>
  </div>
</div>

К сожалению, изменить визуальное представление даты невозможно. Это определяется локалью вашей системы. Хотя вывод всегда будет в одном и том же формате (ISO 8601).

Вы можете прочитать значение ввода даты как объект Date со свойством valueAsDate. Этим объектом можно манипулировать. Добавьте 1 к текущему месяцу и установите текущую дату на 0. Значение 1 будет представлять первое число месяца, 0 представляет собой на один день меньше, то есть последний день предыдущего месяца.

const input = document.querySelector('#effective-date');
const output = document.querySelector('#actual-date');

input.addEventListener('input', event => {
  const date = event.target.valueAsDate;
  date.setMonth(date.getMonth() + 1);
  date.setDate(0);
  output.value = date.toISOString();
});
<label for = "effective-date">Effective Date</label>
<input id = "effective-date" type = "date" name = "effective-date" required />

<label for = "actual-date">The Actual Date</label>
<output id = "actual-date"></output>

Другие вопросы по теме