Mønstre
Spør brukerne om dato og klokkeslett
Det å spørre brukerne om dato og klokkeslett blir ofte løst mer komplisert enn nødvendig. I mange situasjoner er vanlige input-felt både raskere å bruke og lettere å forstå enn egenbygde datovelgere.
Denne artikkelen er utviklet av designsystem-teamet i Digdir i samarbeid med Brønnøysundregistrene. Den har ikke gått gjennom den samme samarbeidsprosessen som mønstrene i Mønster-samarbeidet. Vi vil gjerne ha tilbakemeldinger på artikkelen. Del dem i Slack eller i denne diskusjontråden på github.com.
Hvordan du ber brukerne om dato og klokkeslett, bør ta utgangspunkt i hvilken informasjon du faktisk trenger. Noen datoer er enkle å huske, som fødselsdatoer, mens andre datoer må brukerne lese fra dokumenter eller kort. I noen situasjoner holder det med en omtrentlig dato, eller et tidspunkt i forhold til i dag. Andre ganger skal brukerne velge en dato eller et tidspunkt fra et forhåndsdefinert utvalg.
Unngå å gjøre oppgaven mer komplisert enn nødvendig. Egenbygde datovelgere gir ofte lavere tilgjengelighet og mer friksjon enn enkle tekstfelt. De kan være vanskelige å bruke med tastatur, gir dårlig støtte for skjermleser og krever unødvendig navigering når brukerne allerede kjenner datoen.
Kjente datoer
Når du spør om kjente datoer, som fødselsdato eller bryllupsdato, fungerer enkle tekstfelt godt. Brukerne vet allerede svaret og ønsker ofte å skrive det direkte, uten å måtte navigere i en kalender.
Del gjerne datoen opp i separate felt for dag, måned og år. Det gjør det enklere å skrive inn datoen korrekt og gir bedre støtte for hjelpemidler. Når du ber brukerne om en dato slik den står i et bankkort, pass eller annet dokument, bør feltene samsvare med formatet i dokumentet. Det gjør det enklere å overføre datoen korrekt og reduserer risikoen for feil.
React
Unable to parse html
const KnownDates = () => { return ( <Fieldset> <Fieldset.Legend data-size='lg'>Når ble du født?</Fieldset.Legend> <Fieldset.Description>For eksempel 24 7 1987</Fieldset.Description> <div style={{ display: 'flex', gap: 'var(--ds-size-6)' }}> <Textfield label='Dag' style={{ maxWidth: '3.5em' }} autoComplete='bday-day' inputMode='numeric' pattern='[0-9]*' maxLength={2} /> <Textfield label='Måned' style={{ maxWidth: '3.5em' }} autoComplete='bday-month' inputMode='numeric' pattern='[0-9]*' maxLength={2} /> <Textfield label='År' style={{ maxWidth: '6.5em' }} autoComplete='bday-year' inputMode='numeric' pattern='[0-9]*' maxLength={4} /> </div> </Fieldset> ); }; render(<KnownDates />)
I eksempelet over bruker vi inputmode="numeric" for å gi brukeren numerisk tastatur på mobil og nettbrett. Vi velger bevisst å ikke bruke type="number" for dag, måned og år. type="number" er utviklet for numeriske verdier som kan økes og reduseres. Det gir funksjonalitet som spinnknapper og automatisk validering. Dette er ikke alltid hensiktsmessig når brukeren skal skrive inn en dato, og kan gi tilgjengelighetsutfordringer (mozilla.org).
Dato fra et forhåndsdefinert utvalg
Hvis du vet at brukerne skal velge en dato eller et tidspunkt fra et begrenset utvalg, for eksempel ledige timer den kommende uken, kan det være mer effektivt å tilby disse datoene som ferdige valg.
Når utvalget er svært begrenset, for eksempel noen få datoer eller tidspunkter, kan Radio være et godt valg. Det gjør det raskt og enkelt å velge et alternativ, uten å måtte skrive noe selv.
React
Unable to parse html
const PredefinedOptions1 = () => { return ( <Fieldset> <Fieldset.Legend>Når vil du ha time?</Fieldset.Legend> <Fieldset.Description> Velg blant de neste fem ledige timene vi har, eller velg et senere tidspunkt. </Fieldset.Description> <Radio label='Tirsdag 17. feb kl. 10:00' value='2026-02-17T10:00' name='appointmentTime' /> <Radio label='Tirsdag 17. feb kl. 14:00' value='2026-02-17T14:00' name='appointmentTime' /> <Radio label='Fredag 20. feb kl. 13:30' value='2026-02-20T13:30' name='appointmentTime' /> <Radio label='Mandag 23. feb kl. 08:00' value='2026-02-23T08:00' name='appointmentTime' /> <Radio label='Mandag 23. feb kl. 08:30' value='2026-02-23T08:30' name='appointmentTime' /> <Link href='#la-brukerne-begrense-utvalget' style={{ display: 'flex', marginTop: 'var(--ds-size-6)' }} > Finn ledige timer lengre frem i tid </Link> </Fieldset> ); }; render(<PredefinedOptions1 />)
La brukerne begrense utvalget
Når antall valg øker, kan en Select være nyttig for å begrense utvalget. Da kan brukerne velge blant uker, dager eller klokkeslett de foretrekker, og deretter se de tilgjengelige alternativene for det valget. NB: Eksempelet under fungerer ikke. Det ikke er koblet til et faktisk utvalg av datoer eller klokkeslett, men illustrerer hvordan du kan la brukerne begrense utvalget før de ser de tilgjengelige alternativene.
React
Unable to parse html
const PredefinedOptions2 = () => { return ( <Fieldset> <Fieldset.Legend data-size='lg'>Når vil du ha time?</Fieldset.Legend> <Fieldset.Description> Dersom noen uker ikke er tilgjengelige å velge, betyr det at det ikke finnes ledige tidspunkt i den uken. Foretrekker du tirsdager, kan du velge en bestemt ukedag i stedet for uke. Da vises alle ledige tidspunkt på tirsdager fremover. </Fieldset.Description> <div style={{ display: 'flex', gap: 'var(--ds-size-6)', flexWrap: 'wrap' }} > <Field> <Label>Velg foretrukket uke</Label> <Select defaultValue=''> <Select.Option value='' disabled> Velg en uke … </Select.Option> <Select.Option value='uke8'>Uke 8 (16.feb - 22.feb)</Select.Option> <Select.Option value='uke9'>Uke 9 (23.feb - 1.mars)</Select.Option> <Select.Option value='uke10'> Uke 10 (2.mars - 8.mars) </Select.Option> <Select.Option value='uke11'> Uke 11 (9.mars - 15.mars) </Select.Option> <Select.Option value='uke12'> Uke 12 (16.mars - 22.mars) </Select.Option> <Select.Option value='uke14'> Uke 14 (30.mars - 5.april) </Select.Option> <Select.Option value='uke15'> Uke 15 (6.april - 12.april) </Select.Option> <Select.Option value='uke16'> Uke 16 (13.april - 19.april) </Select.Option> </Select> </Field> <Field> <Label>Velg foretrukket dag</Label> <Select defaultValue='Tirsdag'> <Select.Option value='' disabled> Velg en dag … </Select.Option> <Select.Option value='Mandag'>Mandag</Select.Option> <Select.Option value='Tirsdag'>Tirsdag</Select.Option> <Select.Option value='Onsdag'>Onsdag</Select.Option> <Select.Option value='Torsdag'>Torsdag</Select.Option> <Select.Option value='Fredag'>Fredag</Select.Option> </Select> </Field> <Field> <Label>Velg foretrukket klokkeslett</Label> <Select defaultValue=''> <Select.Option value='' disabled> Velg et klokkeslett … </Select.Option> <Select.Option value='08-11'>Mellom 08:00 og 11:00</Select.Option> <Select.Option value='11-14'>Mellom 11:00 og 14:00</Select.Option> <Select.Option value='14-17'>Mellom 14:00 og 17:00</Select.Option> <Select.Option value='17-20'>Mellom 17:00 og 20:00</Select.Option> </Select> </Field> </div> <Fieldset style={{ marginTop: 'var(--ds-size-6)' }}> <Fieldset.Legend>Velg et av de ledige tidspunktene</Fieldset.Legend> <Radio label='Tirsdag 17. feb kl. 10:00' value='2026-02-17T10:00' name='appointmentTime' /> <Radio label='Tirsdag 17. feb kl. 14:00' value='2026-02-17T14:00' name='appointmentTime' /> <Radio label='Tirsdag 24. feb kl. 08:00' value='2026-02-24T08:00' name='appointmentTime' /> <Radio label='Tirsdag 24. feb kl. 09:30' value='2026-02-24T09:30' name='appointmentTime' /> <Radio label='Tirsdag 3. mars kl. 12:30' value='2026-03-03T12:30' name='appointmentTime' /> </Fieldset> </Fieldset> ); }; render(<PredefinedOptions2 />)
Du bør kun vise valg som har ledige timer. Unngå for eksempel å deaktivere uker som ikke har ledige timer, da det kan skape forvirring. Forklar på forhånd at brukerne kun ser uker med ledige tidspunkt, slik at de forstår hvorfor det er noen uker de ikke kan velge.
Konkret dato i nær fremtid eller fortid
Noen ganger når brukerne skal velge en konkret dato tett opp mot dagens dato, kan det være nyttig å gi visuell støtte. En Input med type="date" lar brukerne enten skrive datoen direkte eller bruke nettleserens innebygde datovelger. Dette gir ofte en god balanse mellom fleksibilitet og støtte. Støtten varierer mellom nettlesere og enheter, både når det gjelder funksjonalitet, utseende og interaksjon, men løsningen er ofte mer tilgjengelig og robust enn egenbygde alternativer.
React
Unable to parse html
const NearFuturePast = () => { return ( <Textfield label='Når skal fristen for innlevering være?' type='date' style={{ maxWidth: '14em' }} /> ); }; render(<NearFuturePast />)
Vær oppmerksom på at type="date" styres av brukerens operativsystem og regionale innstillinger, ikke av språket på nettsiden. Det kan føre til at datoen vises i et annet format enn brukeren forventer. Vurder om det er behov for ekstra tydelighet, for eksempel ved å vise valgt dato i klartekst med måned skrevet med bokstaver, eller på annen måte bekrefte datoen før den lagres.
Start- og sluttdato
Når brukerne skal oppgi en periode, bør startdato og sluttdato vises tydelig sammen. Bruk to separate felt, og gjør det klart hvilken dato som er hvilken.
Plasser feltene i logisk rekkefølge, og valider at sluttdato ikke er før startdato. Hvis datoene avhenger av hverandre, bør feilmeldinger forklare hva som er galt og hvordan brukerne kan rette det.
React
Unable to parse html
const StartEndDate = () => { return ( <Fieldset> <Fieldset.Legend data-size='lg'> Hvor lenge skal du være borte? </Fieldset.Legend> <Fieldset.Description>Oppgi start- og sluttdato</Fieldset.Description> <div style={{ display: 'flex', gap: 'var(--ds-size-6)' }}> <Textfield label='Startdato' type='date' /> <Textfield label='Sluttdato' type='date' /> </div> </Fieldset> ); }; render(<StartEndDate />)
Klokkeslett – start og slutt
Når brukerne skal oppgi et tidsintervall, som åpningstid eller varighet på et møte, kan du bruke en Input med type="time". Det lar brukerne skrive klokkeslettet direkte, samtidig som nettleseren tilbyr støtte.
Bruk separate felt for start- og sluttid, og vis dem tydelig sammen.
React
Unable to parse html
const StartEndTime = () => { return ( <Fieldset> <Fieldset.Legend data-size='lg'> Hvor lenge varer skoledagen? </Fieldset.Legend> <Fieldset.Description>Oppgi start- og sluttid</Fieldset.Description> <div style={{ display: 'flex', gap: 'var(--ds-size-6)' }}> <Textfield label='Fra kl' type='time' /> <Textfield label='Til kl' type='time' /> </div> </Fieldset> ); }; render(<StartEndTime />)
Omtrentlig tidspunkt
Hvis brukerne bare trenger å oppgi måned og år, bør det være mulig å gjøre nettopp det. Dette er særlig relevant når hendelsen ligger langt tilbake i tid, og brukerne ikke nødvendigvis vet nøyaktig tidspunkt.
For eksempel kan du la brukerne oppgi omtrentlig tid i et fritekstfelt, eller tilby egne felt for kun måned og år, som i eksempelet under.
React
Unable to parse html
const ApproximateDate = () => { return ( <Fieldset> <Fieldset.Legend data-size='lg'>Når skjedde hendelsen?</Fieldset.Legend> <Fieldset.Description> Oppgi omtrentlig tidspunkt. Vi kan ikke behandle saker lengre enn 20 år tilbake i tid. </Fieldset.Description> <div style={{ display: 'flex', gap: 'var(--ds-size-6)' }}> <Field> <Label>Måned</Label> <Select defaultValue='Januar'> <Select.Option value='januar'>Januar</Select.Option> <Select.Option value='februar'>Februar</Select.Option> <Select.Option value='mars'>Mars</Select.Option> <Select.Option value='april'>April</Select.Option> <Select.Option value='mai'>Mai</Select.Option> <Select.Option value='juni'>Juni</Select.Option> <Select.Option value='juli'>Juli</Select.Option> <Select.Option value='august'>August</Select.Option> <Select.Option value='september'>September</Select.Option> <Select.Option value='oktober'>Oktober</Select.Option> <Select.Option value='november'>November</Select.Option> <Select.Option value='desember'>Desember</Select.Option> </Select> </Field> <Field> <Label>År</Label> <Select defaultValue='2026'> <Select.Option value='2026'>2026</Select.Option> <Select.Option value='2025'>2025</Select.Option> <Select.Option value='2024'>2024</Select.Option> <Select.Option value='2023'>2023</Select.Option> <Select.Option value='2022'>2022</Select.Option> <Select.Option value='2021'>2021</Select.Option> <Select.Option value='2020'>2020</Select.Option> <Select.Option value='2019'>2019</Select.Option> <Select.Option value='2018'>2018</Select.Option> <Select.Option value='2017'>2017</Select.Option> <Select.Option value='2016'>2016</Select.Option> <Select.Option value='2015'>2015</Select.Option> <Select.Option value='2014'>2014</Select.Option> <Select.Option value='2013'>2013</Select.Option> <Select.Option value='2012'>2012</Select.Option> <Select.Option value='2011'>2011</Select.Option> <Select.Option value='2010'>2010</Select.Option> <Select.Option value='2009'>2009</Select.Option> <Select.Option value='2008'>2008</Select.Option> <Select.Option value='2007'>2007</Select.Option> <Select.Option value='2006'>2006</Select.Option> </Select> </Field> </div> </Fieldset> ); }; render(<ApproximateDate />)
Dato relativt til en annen dato
I noen situasjoner er det mer naturlig å spørre om tidspunkter relativt til en annen dato, for eksempel når brukerne setter opp en påminnelse. Da kan det være bedre å bruke en Select for å gi brukerne valg om «i morgen», «om 3 dager» eller «1 dag før». Hvis ukedag er viktig for oppgaven, bør denne vises tydelig i tillegg.
React
Unable to parse html
const RelativeDate = () => { return ( <Field> <Label>Når vil du ha påminnelse?</Label> <Select defaultValue='1 dag før'> <Select.Option value='15 minutter før'>15 minutter før</Select.Option> <Select.Option value='30 minutter før'>30 minutter før</Select.Option> <Select.Option value='1 time før'>1 time før</Select.Option> <Select.Option value='2 timer før'>2 timer før</Select.Option> <Select.Option value='1 dag før'>1 dag før</Select.Option> <Select.Option value='2 dager før'>2 dager før</Select.Option> <Select.Option value='3 dager før'>3 dager før</Select.Option> <Select.Option value='1 uke før'>1 uke før</Select.Option> </Select> </Field> ); }; render(<RelativeDate />)
Oppsummering
Start med behovet, og velg den løsningen som lar brukerne løse oppgaven raskest mulig. Ofte er vanlige tekstfelt både mer tilgjengelige og raskere å bruke enn avanserte datovelgere.
- Vis ferdige valg når alternativene er begrensede
- La brukerne skrive når svaret er kjent
- Spør bare om så presis dato og tid som situasjonen krever
- Bruk innebygd nettleserstøtte fremfor egenbygde løsninger
Kilder og relevant informasjon
- Who needs a JavaScript date picker? (dbushell.com)
- Maybe You Don’t Need a Date Picker (adrianroselli.com)
- Ask users for dates (gov.uk)