Get startedFoundationsComponentsPatternsRules

Datetime Picker

날짜와 시간을 직접 입력하거나 달력·시간 목록에서 고르게 하는 입력 필드예요.

설치

pnpm dlx shadcn@latest add https://rebar.conmarket-landing.workers.dev/r/steel/datetime-picker.json

Examples

한 파일에서 세 가지 컴포넌트를 내보내요.

컴포넌트용도값 형식
DateTimePicker날짜와 시간을 함께 입력YYYY-MM-DDTHH:mm (시간대가 있으면 뒤에 붙어요)
DatePicker날짜만 입력YYYY-MM-DD
TimePicker시간만 입력HH:mm

Date picker

입력란을 누르면 아래에 달력이 열려요. 2026. 10. 27. 처럼 직접 입력해도 되고, 입력하는 동안 달력이 그 날짜로 따라가요. 값이 있으면 오른쪽 아이콘이 지우기 버튼으로 바뀌어요.

Time picker

입력란을 누르면 times 목록이 열려요. 기본 목록은 09:00 부터 18:00 까지 30분 간격이에요. 글자를 입력하면 목록이 걸러져요.

Form

필드 위에 label 을, 아래에 도움말을 두고 aria-describedby 로 연결해요. name 을 주면 숨은 input 으로 폼에 값이 함께 제출돼요.

Required

필수 입력은 라벨에 별표를 붙이고 isRequired 를 켜요. 입력에 aria-required 가 붙어요.

Validation

값이 규칙에 맞지 않으면 isInvalid 로 빨간 테두리를 보여주고, 아래에 무엇을 고쳐야 하는지 메시지를 적어요. 아래는 오늘(2026-10-27) 이전 날짜를 막는 예예요.

Spacing

spacing="compact" 로 높이를 40px 에서 32px 로 줄여요. 표나 필터 막대처럼 밀도가 높은 곳에 써요.

Disabled dates

달력에서 고를 수 없는 날짜를 정하는 방법은 세 가지예요. 특정 날짜는 disabled, 기간은 minDate·maxDate, 복잡한 규칙(예: 평일만)은 disabledDateFilter 를 써요. 직접 입력하는 값까지 막지는 않으니 검증도 함께 해요.

Locale

locale 에 따라 날짜·시간 표기와 달력 이름이 바뀌어요. 하이드레이션이 어긋나지 않도록 Intl 대신 고정 규칙을 써요.

locale날짜시간
ko-KR (기본)2026. 10. 27.오후 2:30
en-US10/27/20262:30 PM
ja-JP2026/10/2714:30

Week start day

weekStartDay 로 달력의 주 시작 요일을 정해요. 0 은 일요일, 1 은 월요일이에요.

Date and time formats

dateFormat, timeFormat 에 date-fns v1 토큰(YYYY, MM, DD, HH, hh, mm, A …)을 넘겨 표기를 바꿔요. 직접 입력한 값도 같은 순서로 읽어요. 더 세밀하게 바꾸려면 formatDisplayLabel, parseInputValue 를 써요.

Times and editable time

times 로 목록을 바꾸고, timeIsEditable 을 켜면 목록에 없는 시간도 입력해서 Enter 로 정할 수 있어요. 9, 930, 오후 4:45, 16:45 모두 읽어요. shouldShowTimeButton 은 오른쪽에 시계 버튼을 붙여요.

States

비활성(isDisabled), 오류(isInvalid), 평소엔 테두리가 없는 appearance="subtle" 을 지원해요. DateTimePicker 는 포커스된 쪽(날짜 또는 시간) 입력에 border.focused 링을 한 겹 더 그려서, 지금 어느 칸을 입력하는지 바깥 테두리까지 2px 로 보여줘요.

Usage guidelines

  • 폼에서 날짜와 시간을 함께 받아야 하면 DateTimePicker 를, 하나만 필요하면 DatePicker 나 TimePicker 를 써요.
  • 라벨은 필드 위 왼쪽에 두고, 무엇의 날짜·시간인지 짧고 분명하게 써요. (예: "릴리스 일시", "검토 마감일")
  • 입력 방법을 하나로 묶지 않아요. 키보드로 입력하는 편이 빠른 사람도, 달력에서 고르는 편이 편한 사람도 있어요.
  • 달력에서 일부 날짜를 막았다면 그 이유와 오류 메시지를 함께 보여줘요. 직접 입력한 값은 막히지 않으니 제출 전에 검증해요.
  • 사용자에게 익숙한 표기가 되도록 locale 을 맞춰요.
Do· 라벨에 대상 밝히기
"회의 일시"처럼 어떤 일정의 날짜·시간인지 라벨에 적어요.
Don't· 이유 없는 비활성
설명 없이 날짜를 막으면 사용자는 왜 고를 수 없는지 몰라요.

Accessibility

  • 입력은 role="combobox" 예요. 날짜 입력은 달력(aria-haspopup="grid"), 시간 입력은 목록(aria-haspopup="listbox")을 열어요.
  • DatePicker: ↓·↑ 로 달력을 열고 포커스를 날짜로 옮겨요. 달력 안에서는 방향키로 날짜를 옮기고 Enter·Space 로 고르면 입력란으로 돌아와요. Esc 는 달력을 닫아요.
  • TimePicker: ↓·↑ 로 옵션을 옮기고(aria-activedescendant), Home·End 로 처음·끝으로 가요. Enter 로 고르고 Esc 로 닫아요.
  • 라벨이 "날짜", "시간"이 아니면 datePickerProps·timePickerProps 의 label 로 각 입력의 이름을 알려줘요.
  • shouldShowCalendarButton 으로 달력 버튼을 붙이면 openCalendarLabel 과 label·inputLabel·inputLabelId 중 하나로 버튼 이름을 정해요. 시간 쪽은 shouldShowTimeButton 과 openTimeLabel 이에요.
  • 지우기 버튼은 탭 순서에서 빠져 있어 키보드 사용자의 흐름을 끊지 않아요. 이름은 clearControlLabel 로 "회의 일시 지우기"처럼 구체적으로 정해요.

Props

DatePicker

Prop

Type

TimePicker

Prop

Type

DateTimePicker

Prop

Type

On this page