At this point in time there's no property in Schema.org that would allow a business to directly communicate holiday periods (e.g., Christmas) to Google bots and other web crawlers. There seems to be an open issue on Schema.org's GitHub repository however there's no telling when or if something will get added.
I have seen two solutions to this issue so far:
Use
openingHoursSpecification
withoutopens
andcloses
properties.<p property="openingHoursSpecification" typeof="OpeningHoursSpecification"> Closed between <time datetime="2025-08-07" property="validFrom">24th of December</time> and <time datetime="2025-08-07" property="validThrough">26th of December</time>. </p>
This seems like a nice solution but do we have any evidence that Google bots will properly understand this? It seems to validate in Google's Structured Data Testing Tool but does that mean that
opens
andclosed
properties are not required by Google?Use
openingHoursSpecification
with equalopens
andcloses
properties.<p property="openingHoursSpecification" typeof="OpeningHoursSpecification"> Closed between <time datetime="2025-08-07" property="validFrom">24th of December</time> and <time datetime="2025-08-07" property="validThrough">26th of December</time>. <meta content="00:00:00" property="opens" /> <meta content="00:00:00" property="closes" /> </p>
Again a nice solution but there seems to be little to no evidence of web crawlers correctly understanding this and not treating this as incorrect markup. Also it seems a bit illogical to have to specify that a business is open for zero seconds.
The only other solution I can think of to use openingHoursSpecification
with validFrom
and validThrough
properties to specify all time frames seperatly (even when the default opening hours are valid).
<div property="openingHoursSpecification" typeof="OpeningHoursSpecification">
<meta content="10:00:00" property="opens" />
<meta content="18:00:00" property="closes" />
<meta content="2025-08-07" property="validThrough" />
</div>
<p>
Closed between <time datetime="2025-08-07">24th of December</time> and <time datetime="2025-08-07">26th of December</time>.
</p>
<div property="openingHoursSpecification" typeof="OpeningHoursSpecification">
<meta content="10:00:00" property="opens" />
<meta content="18:00:00" property="closes" />
<meta content="2025-08-07" property="validFrom" />
</div>
Of course this solution is also flawed:
It requires potentially a lot of duplicate markup.
It relies heavily on using "invisible"
meta
elements instead of marking up visible data which is what Google recommends.
So which one of these solutions is best/least incorrect? Is there a better solution?