Date Picker로 Date 값 저장하기
데이트피커 사용 시 Date 타입 형식에 맞게 String 저장하는 방법
예쁜 date picker 플러그인들은 대부분 인풋을 클릭하면 드랍다운이 보여지면서 그 안에 table요소 달력을 띄워놓는 형식이다. 이때 input[type=’date’]에는 브라우저 디폴트 date picker가 달려 있기 때문에 대부분 input[type=’text’]를 대신 사용한다. 그러고 나서 JS로든 서버 측에서든 date 변수로 바꿔주는 것이다.
하지만 그럴 필요 없이 간단한 작업을 통해 input[type=’date’]를 그대로 사용하는 것이 가능하다. 물론 어떤 datepicker 라이브러리를 사용하느냐에 따라 다르겠으나, date format을 조작할 수 있는 옵션이 딸려 있다면 더욱 쉽다. 나의 경우 vanilla js 버전 Pikaday를 기준으로 아래 코드를 썼다. 자주 쓰이는 jQuery datepicker도 유사한 방식으로 가능하다.
1. HTML
<input id="datepicker" type="date">
위에서 말했듯이 date type으로 input을 만들어준다.
2. CSS
input[type="date"]::-webkit-calendar-picker-indicator,
input[type="date"]::-webkit-inner-spin-button {
display: none;
appearance: none;
}
첫번째 가상선택자 ::webkit-calendar-picker-indicator 는 역삼각형 모양의 datepicker 드롭다운 시키는 버튼 선택자이고,
두번째 가상선택자 ::webkit-inner-spin-button은 1일씩 올리거나 내리는 위아래 버튼 선택자이다.
둘다 뵈기 싫은 느낌이 다분하니 display: none
시켜주도록 하자. appearance: none
도 platform-native 스타일링을 제거해주기 위해 넣는 편이 좋다.
input[type="date"]::-webkit-calendar-picker-indicator {
color: rgba(0, 0, 0, 0); //숨긴다
opacity: 1;
display: block;
background: url(https://mywildalberta.ca/images/GFX-MWA-Parks-Reservations.png) no-repeat; // 대체할 아이콘
width: 20px;
height: 20px;
border-width: thin;
}
참고로 그냥 브라우저 디폴트 datepicker을 사용하되, 아이콘을 바꾸고 싶은 경우에는 위와 같이 버튼을 숨기고 아이콘을 넣어줄 수 있다.
3. JS
var picker = new Pikaday({
field: document.getElementById('datepicker'),
format: 'yyyy-MM-dd',
toString(date, format) {
let day = ("0" + date.getDate()).slice(-2);
let month = ("0" + (date.getMonth() + 1)).slice(-2);
let year = date.getFullYear();
return `${year}-${month}-${day}`;
}
});
datepicker 라이브러리에 따라 다르지만, 이 코드의 핵심은 5~8번째 줄이다. string 타입으로 리턴을 해주는데, 이를 date type input이 인식할 수 있는 string 형태로 변환해주기만 하면 된다.
format: 'yyyy-MM-dd'
내가 사용한 Pikaday 같은 경우에는 아무 설정도 하지않으면, 11 August, 2018
형태로 반환이 된다. 포맷을 설정해주면 이제 2018-8-11
형태로 반환되기 시작된다.
( "0" + date.getDate() ).slice(-2);
그러나 Pickaday 옵션에 포맷을 설정해주어도 한 자리 수 앞에 0이 삽입되지 않아 오류가 발생한다. 이는 위와 같은 코드로 커스터마이즈할 수 있다. 입력값을 date
라는 변수로 받아 js 내장함수 getDate()
로 date
에서 일자 부분을 빼온다. 이 일자 앞에 무조건 "0"
을 붙이고 slice(-2)
로 뒤 두 자리만 남기는 것이다.
위 코드를 모두 작성하고 나면 다음과 같은 결과를 얻을 수 있다.
See the Pen datepicker with date type input - disabling default datepicker by JaeYoon Song (@jyoonsong) on CodePen.
Ref
https://css-tricks.com/almanac/properties/a/appearance/
https://stackoverflow.com/questions/29436074/change-date-input-triangle-to-a-calendar-icon
https://stackoverflow.com/questions/11320615/disable-native-datepicker-in-google-chrome