[javascript] 날짜 선택 필드의 날짜 선택 범위를 제한하기

HTML의 날자 입력 필드는 별도의 날짜 라이브러리 없이도 날짜 선택을 편리하게 할 수 있게 해주는 새로운 HTML의 입력 타입입니다.

날짜 입력 필드

날짜 입력 필드로 날짜를 선택할 때는 두 가지 속성을 이용해서 선택할 수 있는 날짜 범위를 제한할 수 있습니다.

  • min: 선택할 수 있는 최소 날짜. 최소 날짜 이전 날짜는 선택할 수 없음
  • max: 선택할 수 있는 최대 날짜. 최대 날짜 이후 날짜는 선택할 수 없음

HTML 태그로는 다음처럼 작성하면 됩니다. 2024-01-01 ~ 2024-02-15 날짜 범위 안의 날짜만 캘린더에서 선택 가능하며, 그 이외의 날짜는 회색으로 표시되고 선택이 불가능합니다.

<input type="date" id="dateselect" min="2024-01-01", max="2024-02-15">
2024-02-15 이후 날짜는 선택 불가능

백엔드에서 HTML을 생성할 때 min, max 속성을 설정하는 방법도 있지만, UI의 조건 설정에 따라 선택할 수 있는 날짜 범위를 동적으로 설정하려면 javascript로 min, max 속성 값을 설정해야 합니다.

min, max 속성에 설정하는 날짜 포맷은 YYYY-MM-DD 10자리입니다.

자바스크립트에서는 날짜 객체의 toISOString() 함수를 사용해서 원하는 포맷의 문자열을 얻을 수 있습니다.

let today = new Date();
console.log(today.toISOString().substring(0,10))

로케일 보정

다만 toISOString() 함수는 ISO8601 기준의 24자리(또는 27) 날짜/시간을 반환하고 UTC 표준시간을 표시합니다. 서울과는 9시간 느린 시간이기 때문에 시간을 보정해야 합니다.

Date 객체는 밀리세컨트 단위 표시이므로 다음처럼 계산식을 사용해서 서울 타임존의 시간을 얻을 수 있습니다.

let offset = 1000 * 60 * 60 * 9 // 9시간 밀리세컨트 값
let today = new Date(Date.now() + offset)

지역에 상관없이 정확한 시간을 얻고 싶으면 날짜 객체의 getTimezoneOffset() 함수로 지역의 분단위 오프셋 값을 얻을 수 있습니다. getTimezoneOffset() 함수는 음수를 반환합니다. 따라서 +9 시간을 하려면 현재 시간에서 빼기를 해야 합니다.

let offset = new Date().getTimezoneOffset() * 60000; // 9시간 밀리세컨드 값
let today = new Date(Date.now() - offset);

속성 값 적용

속성에 적용할 수 있는 문자열 포맷을 만들 수 있으므로 속성에 날짜를 설정합니다.

예약일을 선택할 때는 오늘 날짜 이전 날짜는 선택할 수 없도록 막아야 합니다. min 속성에만 오늘 날짜를 지정하면 오늘날짜 이후의 날짜만 선택할 수 있게 됩니다.

document.getElementById('dateselect').min = today.toISOString().substring(0,10);

또는 setAttribute() 함수로 속성 값을 설정해도 동일합니다.

document.getElementById('dateselect').setAttribute("min", today);

날짜 범위 제한

오늘 날짜부터 3개월 날짜 범위의 날짜만 선택할 수 있게 하려면 min, max 속성을 모두 설정해야 합니다.

//min
document.getElementById('dateselect').min = today.toISOString().substring(0,10)

//max 날짜는 3개월 오늘 날짜 전일
today.setMonth(today.getMonth()+3)
today.setDate(today.getDate()-1)
document.getElementById('dateselect').max = today.toISOString().substring(0,10)

월 단위로 말일까지 선택 가능한 날짜 범위를 제한하려면 setDate() 함수로 -1을 입력하면 전월 말일을 선택할 수 있습니다.

전월 말일이 몇일인지 정확하게 알 수 없을 때 이 방법으로 전월 말일을 선택할 수 있습니다.

today.setDate(-1)
document.getElementById('dateselect').max = today.toISOString().substring(0,10)

[Javascript] 날짜 더하기와 빼기, 그리고 날짜 사이 시간 구하기
자바스크립트에서 현재 시각을 얻는 방법과 날짜 객체에서 연도, 월, 일을 구하는 방법을 알아봤습니다. 또한 날짜 값을 원하는 형식으로 변환하는 방법도 알아봤습니다. 날짜 객체에 년/월/일을 설정하는 메서드도 소개되었습니다. 년, 월, 일을 더하거나 빼는 방법, 두 날짜 사이의 연도 차이

javascript Date() 현재 날짜, 오늘, 어제, 전월 말일 날짜 계산과 출력 포매팅
자바스크립트에서 날짜를 처리하는 객체인 Date객체를 이용해서 다양한 형태의 날짜 문자열을 출력하고, 오늘 날짜, 어제, 내일, 지난달 말일과 같은 자주 쓰는 날짜로 빠르게 변경하는 방법을 소개합니다.