Problem/Motivation
When creating a datetime_range field, the "Date type" setting offers three options:
- Date and time
- Date only
- All day
The difference between Date only and All day is hard to understand.
There is currently no UI description explaining how these options behave differently.
Steps to reproduce
- Add a field
Date and Time - Select the
Choose a field type:Date range - View the current description, without an explanation of the types.
Proposed resolution
For the "Date range" field, you need to add a description that lists and explains the three possible types. To make the three options easier to distinguish, we need to change the field from a drop-down menu to radio buttons so that all three options are displayed at the same time.
Remaining tasks
Usability review to confirm the new text.
User interface changes
Before:
In the User interface, here is the default display:

After:
In the user interface, here is how the various options are displayed, with selection via radio buttons:

| Comment | File | Size | Author |
|---|---|---|---|
| #36 | new_radios.png | 35.99 KB | pcharrat |
| #28 | voiceover.mp4 | 1.92 MB | rkoller |
| #28 | jumpy_focus.mp4 | 867.64 KB | rkoller |
| #25 | new_all_day.png | 7.67 KB | pcharrat |
| #25 | new_date_only.png | 6.6 KB | pcharrat |
Issue fork drupal-3023777
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #12
smustgrave commentedThis came up as the daily BSI target
Since I don't use the date range field often guess I've never noticed this but indeed it's not clear. Searching the code
I would of never known that.
Wonder if a simple solution would be just to add a simple description for the 3 options?
Comment #13
smustgrave commentedSeems like a good task for a new user.
Comment #16
pcharratComment #17
smustgrave commentedThanks but part of the ticket was also updating the issue summary please. With UI changes screenshots should be included too please
If you are another contributor eager to jump in, please allow the previous poster(s) at least 48 hours to respond to feedback first, so they have the opportunity to finish what they started!
Comment #18
pcharratComment #19
smustgrave commentedThink this is an improvement for sure
Comment #20
quietone commentedThis is changing text on the UI so it should pass the Usability Core Gate. Following that, this should be tagged 'Usability', so adding tag.
While this is an improvement, I think we should get the usability folks to confirm the new text, so tagging for a review. I will comment in the #ux channel about this. There are already screenshots here, so this should be ready for them to review.
And un-assigning per Assigning ownership of a Drupal core issue.
Comment #21
joachim commentedI'm still scratching my head over why you'd actually need these two types, as #12 explains WHAT is stored but not WHY.
My best guess is that it's to do with duration calculations, which won't work as you might want them with the 'date only' option?
What happens to the end date with the 'all day' option?
It would be useful to experiment with both types and see what is stored and how it behaves.
Also, if the original designers on this could be identified, their input on this would be easier than picking at it.
Comment #22
joachim commentedAh yes, the end value is set to 1 second to midnight:
> $end_date->setTimeZone($user_timezone)->setTime(23, 59, 59);
So with 'all day' you get datetimes stored with times, with the times automatically set to 00:00 and 23:59.
This is better than storing a date only in cases where you need work with the date interval, e.g.:
- calculating how long the period is
- making DB queries to check whether something is in the interval
- avoiding overlaps between different items
Comment #23
benjifisherUsability review
We discussed this issue at #3587931: Drupal Usability Meeting 2026-05-08. That issue has a link to a recording of the meeting. I am giving issue credit here to the attendees at the usability meeting: @benjifisher, @pallavi singh3013, and @rkoller.
We agree that the proposed change is an improvement on the current text, but we think it is also important to mention timezones. We feel that this is more important than the points raised in Comments #21 and #22.
For example, if I add two datetime-range fields, one with each option, then create a node setting both of them to the range May 8 to May 9, then this is what I see in the database:
The all-day range goes from 12 AM on May 8 to 11:59:59 PM on May 9 in my timezone (America/New York, currently UTC-4 thanks to DST). That gets saved in the database as
2026-05-08T04:00:00to2026-05-10T03:59:59. If @rkoller (UTC+2) views my event, then it will appear as 6 AM on May 8 to 5:59:59 AM on May 10.We do not have a recommendation for the exact wording, but we suggest adding examples based on the current date and time. For example, it might look something like this (assuming the current time is 15:44 in UTC-4):
That ends up being a lot of text. Maybe it would be better to show only one line (without the initial label) depending on the currently selected option.
If you want more feedback from the usability team, a good way to reach out is in the #ux channel in Slack.
Comment #24
rkollerThanks for the write up @benjifisher! One brief addition about the micro copy , in the current state the micro copy is also sort of redundant. You first have the option label in the select and then the same label again in the description (which is currently necessary to distinguish the three lines) and then the first two descriptions are more or less repeating the same for a third time; for date and time that the date and time is stored and for date only that only the date without the time is getting stored.
There is one other detail to note that i forgot to test during the meeting. If you are interacting with the select with a screenreader active (voiceover in my case), there are two additional noteworthy details and one question that comes up (check aural_interface.mp4):
And finally I've noticed one odd behavior in focus management with voiceover active (which is out of the scope for this issue). As illustrated in change_field_type.mp4, the select element gets into focus, you then change the default option to one other option (but with the select still in focus), when you then change the option for a second time the focus on the select is getting lost and moved to the(*the problem in the striked section i am unable to reproduce anymore - initially ran into it in safari, then tried in firefox and edge where i was unable to reproduce, and when i revisited in safari i was unable to reproduce either - but before it was consistently changing the element in focus).Change field typebutton - without voiceover active the focus remains on the select elementComment #25
pcharratHello,
I've updated my code to reflect your feedback. You'll find the new descriptions in the images below. I've modified the functionality so that the specific description appears only for the selected type, and I've revised the wording to include examples.
However, there is still a question regarding the examples. For now, I have stuck with static examples. I wonder if it might be better to use dynamic examples, even though that would require more resources each time the form is generated.
Comment #26
pcharratComment #27
smustgrave commentedApplying the change and does appear feedback is addressed @benjifisher could we remove the usability review tag?
Comment #28
rkollerUsability review
We discussed this issue for a second time at #3592720: Drupal Usability Meeting 2026-06-19. The link to the recording: https://www.youtube.com/watch?v=8fuVN9kiZ1c&t=11s.The attendees at the usability meeting were: @benjifisher, and @rkoller.
Thanks to @pcharrat for working on the MR and incorporating the feedback in #23! We have taken another look at the current state of MR15387 and there are few more details to note.
In regard to the question in #25, we still think having dynamic examples based on the current date (and time) would make the examples more clear in particular for the
Date and timedate type.We've discovered several problems in the context of accessibility, for one with the MR checked out, but also already within the main branch. The problem for core in general, if you are interacting with a select element within a dialog modal by keyboard with VoiceOver enabled, as soon as you are trying to expand the option list of a select element for a second time by pressing the space bar the focus jumps to the
Change field typebutton - that is not in line with WCAG 2.2 SC3.2.1 (jumpy_focus.mp4 - recorded with the main branch checked out) but clearly out of the scope for this issue, it should be solved in a dedicated followup issue.In addition to that, the dynamic change of descriptions for the selected select element option are communicated in a confusing and misleading manner within the aural interface. In voiceover.mp4 (recorded with MR15387 checked out), first the label of the active option and its corresponding description for the select element are being announced, including the title of the field set (Field storage) and its help text, then the label of the active option and its corresponding description are announced a second time, and finally also the allowed number of value's active option and the chosen value are being announced in one go. If you then change from the date type
Date and timetoDate onlythe description for theDate and timedate type is announced another time, plus the element is now announced as dimmed aka disabled which is not true. At this point the core bug illustrated in jumpy_focus.mp4 kicks in. But you can see in the following that the correct description was only announced for the default option when the dialog modal was opened for the first time, in the following it looks like always the description of the previous choice is being announced. The question is, is the cause for this misbehavior rooted in Drupal core or VoiceOver - as a first required step it would be important to test the MR in Jaws, NVDA, Orca, and or any other screenreader solution - I am adding theNeeds accessibility reviewtag for that reason, and also to get few more pair of eyes onto that matter.In regard to the micro copy, aside using dynamic example based on the current date (and time) we would recommend the following changes to the descriptions:
For
Date and timeStored as UTC date and time values (Example: 2026-05-09T19:44:00 to 2026-05-09T20:44:00).
For
Date onlyStored as dates only, with no time values (Example: 2026-05-09 to 2026-05-10).
For
All dayStored as a full-day range in UTC, from midnight to 11:59:59 PM in the current user's timezone (Example: 2026-05-09T04:00:00 to 2026-05-11T03:59:59).
We are basically denote that timezones are being minded by Drupal and in what timezone date and time are being stored - a piece of information a user usually has no touchpoint with in the admin UI necessarily. That detail is relevant to
Date and timeandAll daydate types, while we've dropped the mention of timezones for theDate onlydate type.In regard to consistency, we've also realized that the date type descriptions on the
datetimefield type are completely generic and not helpful at all. At the moment you have the same descriptionChoose the type of date to create.for every date type option on thedatetimefield. Our recommendation would be to either extend the scope for this issue or open up a followup that should go into core, alongside with this issue ideally. It should be avoided having two different sets of descriptions, cuzdatetimefields have the same two date types,Date and timeandDate only, as theDatetime range. The only difference, the descriptions fordatetimerequire singular forms, while the descriptions forDatetime rangerequire plural forms. So in consequence our recommendation for the extended scope/followup for the date types on thedatetimefield type are:For
Date and timeStored as UTC date and time values (Example: 2026-05-09T19:44:00).
For
Date onlyStored as date only, with no time value (Example: 2026-05-09).
I've removed the "Needs usability review" tag and updated the User interface section by adding headings for before and after for an improved readability and comprehension.
If you want more feedback from the usability team, a good way to reach out is in the #ux channel in Slack.
Comment #29
pcharratI've updated the static wording to match the feedback from #28.
At this stage, I have two questions before going further:
datetimefield type descriptions. Do you want this issue to evolve into a broader update of all date type descriptions, or should it remain limited todatetime_rangeand leave the rest for a follow-up issue?DrupalDateTime,DateTimeZone, and the current user timezone. I am not sure whether that is a good idea here.Comment #30
kentr commentedRE #29:
I vote to put the other changes in a followup.
I vote to address that in a separate issue, because even if it is desirable it's not clear whether the problem is in Drupal or VoiceOver. From #28:
Comment #31
joachim commented> It would be possible to generate examples dynamically so that they better reflect the current date/time and timezone context,
Generally I think dynamic date and time examples are bad, because it's possible for it to be a date or time that causes ambiguity.
For example, if you are illustrating US vs international date format, and it happens to be the 7th of July, then both look identical!
As for the a11y bugs, it's great that this issue has uncovered them, but they should be separate issues, so this issue is just about UI text.
Comment #32
joachim commentedActually, one a11y bug is about to go away:
> $element['datetime_type']['#description'] = $descriptions[$type] ?? '';
This is not the right way to do this. We should not be adding a description for only the currently-selected option, because that forces a user to click through all of them to get an overview.
Each radio button should have its own description -- this can be done by adding the #description to a sub-array -- the render element should have docs about it (I added them a few years ago!)
Comment #33
kentr commentedCreated:
Comment #34
pcharratThank you for clarifying that.
Just to make sure I understand the direction we’re taking: the current approach, which involves displaying only the description of the selected option—was based on comment #23, which suggested that it might be better to display only a single line based on the currently selected option.
So, if this approach is no longer considered the right one, should I revert to the original proposal, that is, displaying all the descriptions together so that users can compare the three options at the same time like #18?
Thank you in advance for your time,
Comment #35
joachim commentedIt would be expanding the scope of this issue, but I think a set of radios, each with their own description, would be much better UX than the current select element.
For several reasons:
1. Even as a sighted user, having to try all the options to understand the meaning of each one is bad UX. Furthermore, you can only see one at a time, so if you're not sure, you have to keep going back and forth to see the descriptions.
2. It would (probably?) fix #3611773: [PP-1] Datetime range configuration dynamic descriptions are confusing within the aural interface?
3. Having the description of the currently-selected value on the element #description is not correct from a structural point of view -- the #description for the element should tell you the meaning and purpose of the whole element.
Comment #36
pcharratSo would that mean changing it to have a form like this?

Comment #37
joachim commentedI think that would be much clearer, yes.
Comment #38
pcharratI updated the UI for the Date type setting by changing the widget from a
selecttoradios, so all available options are visible at once.I also modified the editing test on
DateRangeFieldTestto verify that all three options were indeed disabled.However, I'm getting an error with 👷️️️ PHPUnit Build that I can't figure out, and I'd really appreciate your expertise.
Thanks in advance
Comment #39
pcharratComment #40
joachim commentedI think the test failures are unrelated, as they're Composer installation tests and AFAICT don't install modules.
Comment #41
pcharratThat's also my hypothesis based on my research.
Thank you again for taking the time.
Comment #42
smustgrave commentedLeft a comment on the MR.
Comment #43
pcharratI'll update the description with the latest information and screenshots.
As for the scope of the tests, I've made some changes to the field editing section, but I'm not sure if any others need to be modified.
Comment #44
pcharrat