OpeningHoursSpecification
OpeningHoursSpecification tells search engines when a business is open. Google reads it from LocalBusiness and Place markup to display the "Open now" or "Closed" badge in search results and Maps, and to show the full hours table in the knowledge panel. Without it, Google guesses hours from third-party sources or shows no hours at all.
Full example of schema.org/OpeningHoursSpecification json-ld markup
The markup is verified as valid with Rich Results Test from Google.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"@id": "https://xoocode.com/shop/dunmore-1290",
"name": "Xoo Code Shop Dunmore",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "10:00",
"closes": "19:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "10:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Friday",
"opens": "08:00",
"closes": "22:00",
"validFrom": "2026-11-27",
"validThrough": "2026-11-27"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Thursday",
"opens": "00:00",
"closes": "00:00",
"validFrom": "2026-12-25",
"validThrough": "2026-12-25"
}
]
}
</script>dayOfWeek values
dayOfWeek accepts one or more schema.org Day enum values: "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday". Use an array to cover multiple days with the same hours: "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]. The values must be PascalCase English day names. Abbreviations like "Mon" or "Tue" are not recognized. You can also use the full URL form like "https://schema.org/Monday" but the shorthand is more common.
opens and closes format
Use 24-hour time in HH:MM format: "09:00", "17:30", "22:00". Do not use 12-hour format with AM/PM. Midnight closing is "00:00" of the next day, which you can represent as "23:59" to avoid ambiguity. For businesses open 24 hours, set opens to "00:00" and closes to "23:59" (schema.org recommends this pattern).
validFrom and validThrough for seasonal hours
Regular hours do not need date ranges. Seasonal hours, holiday hours, and temporary schedule changes use validFrom and validThrough (ISO 8601 date format, e.g., "2026-12-25") to scope the hours to a specific period. A business can have multiple OpeningHoursSpecification blocks: one set for regular hours (no date range) and additional sets for holidays or seasonal adjustments. Google picks the most specific applicable block for the current date.
Minimal valid version
The smallest markup that still produces a valid OpeningHoursSpecification entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "10:00",
"closes": "19:00"
}
</script>Google rich results this unlocks
OpeningHoursSpecification is a structural type. It does not produce a rich result on its own.
Its value comes from combining it with a primary type whose markup earns a rich result (Article, Product, Event, and so on). OpeningHoursSpecification becomes the trunk that the primary type branches off viamainEntityorbreadcrumb. Include it on every page as the backbone of your markup.
Common OpeningHoursSpecification mistakes
Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.
- 01
12-hour time format with AM/PM
Wrong"opens": "10:00 AM"Right"opens": "10:00"schema.org uses 24-hour time in HH:MM format. "10:00 AM" is not valid. Use "10:00" for 10 AM and "22:00" for 10 PM. Google cannot parse 12-hour formats and will ignore the hours entirely.
- 02
Abbreviated day names instead of full PascalCase
Wrong"dayOfWeek": "Mon"Right"dayOfWeek": "Monday"dayOfWeek values are schema.org enum members. Only the full English day name in PascalCase is recognized: "Monday", "Tuesday", etc. Abbreviations ("Mon", "Tue"), lowercase ("monday"), and non-English names are not valid.
- 03
Missing dayOfWeek for closed days
Wrong(a block with "dayOfWeek": "Sunday" and empty opens/closes to indicate closed)Right(omit Sunday entirely from the openingHoursSpecification array)The simplest way to indicate a closed day is to not include it. Google treats any day not listed as closed. Adding a block with empty or zero times can confuse parsers. If you need to explicitly mark a closure (like a holiday), use opens and closes both set to "00:00".
- 04
Seasonal hours without validFrom/validThrough
Wrong(a second Friday block with different hours but no date range)Right(add "validFrom": "2026-11-27", "validThrough": "2026-11-27" to scope the override)Without date ranges, two blocks for the same day conflict. Google cannot determine which one applies. Regular hours should have no date range (they apply by default). Overrides and seasonal schedules must have validFrom and validThrough so Google knows when to use them.
Schema properties in this example
About the example data
These are the operating hours for Xoo Code Shop Dunmore. The regular schedule (Monday through Saturday) runs year-round. The two additional blocks show holiday overrides: extended Black Friday hours and a Christmas Day closure. The same structure appears nested inside the LocalBusiness example.
Comments
Loading comments...