How AI is powering better personalization in e-commerce [with Vercel]. Sign up now

Best way to store time-only values for store hours in Sanity?

2 repliesLast updated: Nov 29, 2025

Can anyone help me with the best way to store a time only? Like if I wanted to have a page listing store hours...something like:Mon - Thurs: 8
:00am-8:00pmFri - Sat: 8
:00am-10:00pmSun: 8
:00am-6:00pm
What does that content model look like?
AI Update

For storing time-only data like store hours, you have several good options in Sanity:

Simple Approach: String Field with Predefined Options

The most straightforward way is to use a string field with a list of predefined time options:

// timeValue.ts
import {defineType} from 'sanity'

export const timeValueType = defineType({
  name: 'timeValue',
  title: 'Time',
  type: 'string',
  options: {
    list: ALLOWED_TIMES(),
  },
})

function ALLOWED_TIMES() {
  const times = []
  for (let h = 0; h < 24; h++) {
    for (let m = 0; m < 60; m += 30) {
      times.push(`${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}`)
    }
  }
  return times
}

Structured Approach: Object with Start/End Times

For store hours, you'll likely want a start and end time. Create an object type:

// storeHours.ts
import {defineField, defineType} from 'sanity'

export const storeHoursType = defineType({
  name: 'storeHours',
  title: 'Store Hours',
  type: 'object',
  fields: [
    defineField({
      name: 'day',
      title: 'Day of Week',
      type: 'string',
      options: {
        list: [
          {title: 'Monday', value: 'monday'},
          {title: 'Tuesday', value: 'tuesday'},
          {title: 'Wednesday', value: 'wednesday'},
          {title: 'Thursday', value: 'thursday'},
          {title: 'Friday', value: 'friday'},
          {title: 'Saturday', value: 'saturday'},
          {title: 'Sunday', value: 'sunday'},
        ]
      }
    }),
    defineField({
      name: 'open',
      title: 'Opening Time',
      type: 'timeValue',
    }),
    defineField({
      name: 'close',
      title: 'Closing Time',
      type: 'timeValue',
    }),
  ],
  options: {columns: 3}
})

In Your Document

Then use it in an array to define hours for multiple days:

defineField({
  name: 'hours',
  title: 'Store Hours',
  type: 'array',
  of: [{type: 'storeHours'}]
})

This gives you a clean structure like:

Alternative: Custom Input Component

If you want more control over the editing experience, you can create a custom input component with features like:

The string-with-options approach is the simplest and works great for most use cases. The custom input component is worth the extra effort if you need advanced UX features for your content editors.

Show original thread
2 replies

Was this answer helpful?

Sanity – Build the way you think, not the way your CMS thinks

Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.

Related contributions