Managing dates presents a challenge in web applications such as the storage and display of dates and times in different timezones. Events have start and end dates, some may be all-day or repeated.
In Drupal 7 the date
contributed module comes with a lot of features packed into 11 sub-modules. The date
module itself has a "Collect an end date" checkbox with the description of "End dates are used to collect duration, e.g., to allow an event to start on September 15 and end on September 16."
Drupal 8 incorporates a couple of essential contributed modules in-core. So, Datetime
in the Drupal 8 core is the successor of date
. It defines datetime form elements and a datetime field type. The experimental Datetime Range
module provides the ability to store end dates. Like other experimental modules, it has gone through the period of testing and assessment to ensure that it meets the rigorous requirements for Drupal. It has achieved stable status in Drupal 8.4.0.
DateRangeItem
Datetime Range defines the DateRangeItem
field type. This extends the DateTimeItem
class of the DateTimeItem
field which stores the value
(Date value) and date
(Computed date) properties. On the other hand, DateRangeItem
stores 4 properties - value
(Start date value), start_date
(Computed start date), end_value
(End date value), and end_date
(Computed end date).
DateRangeFieldItemList
The DateRangeFieldItemList
follows a similar pattern to DateTimeFieldItemList
from the Datetime module, allowing the selection of "Default start date", "Default end date", and a "Relative default value" for the end date. The relative end date allows any valid time by reference relative to the current day, e.g., '+10 days' (i.e., 10 days from the day the field is created on) or '+1 Monday' (the next Monday) and any other valid strtotime strings.
There is a field widget per field type. The default value may need to be calculated from the field settings if the relative option was selected. They can be configured from the Manage form display
tab of content types.
DateRangeDefaultWidget
For the "Date and time range" widget, there is a date and time widget for the start and end date just like Datetime
.
DateRangeDatelistWidget
The "Select list" widget has configurable select options for the year, month, day, hour, and minute. The "Date part order" is one of "Day/Month/Year", "Month/Day/Year" or "Year/Month/day". The "Time type" is either "24 hour time" or "12 hour time". "Time increments" is "1 minute", "5 minute", "10 minute", "15 minute" or "30 minute".
The similarity to the Datetime
field continues in the output of the date range field. The Datetime
field allows a time zone override which means that the date and time will always be displayed in the selected time zone. Then there is the "Date format" with different options for the display including allowing a display of only the date without time part.
Apart from the "Time zone override" and "Date format" there is a configurable option for the separator between the two parts of a date and time range. The default is a hyphen, "-" but it could be a string such as "to", e.g., 01/03/2017 - 07/03/2017, 20th Aug 2016 to 22nd August 2016, etc.
Datetime
and DateTime Range
modules are so tightly-related and similar that one wonders why they had to be separated in the first place. The only reason that could be put forward is probably lack of time to get the range field into core together with the date field itself.
Therefore, it is not too surprising that Datetime Range
has achieved stable status for Drupal 8.4.0