date
Every date field in Odoo renders through the Date widget. Here is its full option set as shipped in the source: accepted date limits, future warnings, picker precision, display format, and the range pairing the documentation never mentions.
| Studio name | Date |
|---|---|
| Technical name | date |
| Field types | date |
| Views | form, list, kanban |
| Also registered as | same file registers datetime and daterange |
| Module | web, present in every Odoo database |
| Used in core | The implicit default for every date field; 3 explicit widget="date" occurrences, in purchase_requisition and l10n_it_edi_doi |
| Versions | Odoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0 |
| No-code setup | Yes, via Odoo Studio (Enterprise), including most options |
| Alternatives | datetime, daterange, remaining_days, formatted_date |
What the Date field does
What this means for your team
Setting it up in Odoo Studio (no code)
What Studio cannot do here
Supported options in Odoo 19
| Option | Type | What it does |
|---|---|---|
min_date | string | Earliest accepted date, ISO-formatted like 2026-01-31, or the literal string today. Blocks both picking and typing earlier dates.(since Odoo 17.0) |
max_date | string | Latest accepted date, same formats as min_date.(since Odoo 17.0) |
warn_future | boolean | Shows a warning icon with the message This date is in the future whenever the value lies after today.(since Odoo 17.0) |
min_precision | selection: days, months, years, decades | Finest level the picker offers. months turns the picker into a month selector; the stored value becomes the first day of the chosen unit.(default: days)(since Odoo 18.0) |
max_precision | selection: days, months, years, decades | Coarsest level the picker can zoom out to, capping navigation.(since Odoo 18.0) |
numeric | boolean | Switches display from the localized long form (Jan 31, 2026) to the numeric form (31/01/2026), and selects the matching fixed column width in list views.(default: false)(since Odoo 19.0) |
placeholder_field | field name | Date or char field on the record whose value becomes the placeholder, formatted per the numeric setting when it is a date.(since Odoo 19.0) |
start_date_field | field name | Undocumented. Pairs this field as the END of a range whose start lives in the named field; the partner field is auto-added to the view, editable. Shared machinery with daterange.(since Odoo 17.0) |
end_date_field | field name | Undocumented. Pairs this field as the START of a range whose end lives in the named field. Setting both range options logs a console warning and start_date_field wins.(since Odoo 17.0) |
always_range | boolean | Undocumented. With a paired field, always renders the two-sided range input even while one side is empty.(default: false)(since Odoo 17.0) |
Do not set both range options on one field. If start_date_field and end_date_field are both present, the source logs a console warning and start_date_field wins. Each of the two also injects the partner field into the view's field list automatically, with readonly: false, a detail that occasionally surprises people who see a field they never added being written by the form.
Working examples
today, precision, and the knobs that share a file
Version compatibility
| Version | Status | Notes |
|---|---|---|
| Odoo 20.0 | In development | Not released. Option set unchanged on the development branch; adds relative typing like +=7. See below. |
| Odoo 19.0 | Verified | Verified against the shipped source: numeric and placeholder_field added, condensed removed, fixed list column widths. |
| Odoo 18.0 | Verified | Adds min_precision, max_precision and the 18-only condensed option. |
| Odoo 17.0 | Verified | Unified into the datetime component: min_date, max_date, warn_future and the hidden range options arrive; datetime type support dropped. |
| Odoo 16.0 | Partial / changed | Separate legacy widget: single datepicker options object, also accepted datetime fields. None of the modern options exist. |
Upgrade note for 16 to 17 and later. Odoo 16 had a separate date widget file whose only option was a datepicker object passed to the old bootstrap picker, and it also accepted datetime fields. The 17 rewrite merged date into the unified datetime component, introduced the current option names, and dropped datetime from the supported types, with show_time on the datetime widget taking over that job. Views migrated from 16 with options="{'datepicker': ...}" lose those settings silently; re-express them with the modern options during an Odoo migration. The 18-only condensed option was removed in 19, replaced in spirit by numeric.
What is changing in Odoo 20
Common problems and fixes
| Symptom | Cause and fix |
|---|---|
| min_date or max_date seems ignored on imports | Widget options only guard interactive entry; imports and API writes bypass the view. Add a Python constraint for real enforcement. |
| Both range options set, only one works | The source warns and prefers start_date_field when both are present. Set exactly one of start_date_field or end_date_field. |
| A field you never added appears and gets written | Range pairing injects the partner field into the view with readonly false. Expected behavior of start_date_field and end_date_field. |
| Users pick a month but the record shows the 1st | min_precision months stores the first day of the selected unit; the field is still a date. Expected; format reports accordingly. |
| Dates display as Jan 31 style but you want 31/01 | numeric defaults to false. Set options="{'numeric': True}" on the field. |
| widget="date" on a datetime field warns in developer mode | Since 17, the date widget declares only the date type. Use the datetime widget with show_time false to display a datetime as date-only. |
| options="{'datepicker': {...}}" stopped working after upgrade | The 16-era option object was dropped in the 17 rewrite. Re-express the rules with min_date, max_date and precision options. |
Date field vs the alternatives
| Widget | Best for | Key difference |
|---|---|---|
date | Every plain date field | The default date input and calendar, with view-level limits and precision control |
| datetime | Timestamps with a time component | Adds time selection, show_time and seconds handling in the same source file |
| daterange | Start and end dates edited as one control | The declared, documented form of the range pairing this widget hides in options |
| remaining_days | Deadlines shown as Today, Tomorrow, In 3 days | Readonly relative display with urgency coloring instead of an input |
| formatted_date | Custom readonly date compositions | Token-based display formatting, no editing |
Frequently asked questions
How do I restrict which dates users can pick in Odoo?+
How do I warn users about future dates without blocking them?+
Can the Odoo date picker select just a month or a year?+
What is the difference between the date and datetime widgets?+
Can one date field edit a whole range?+
How do I show dates as 31/01/2026 instead of Jan 31, 2026?+
Are the widget's limits enforced on the database?+
What changes for date fields in Odoo 20?+
Date logic that holds up beyond the picker
View options catch typos; real calendars need more. We implement date rules end to end in Odoo, picker limits mirrored by server constraints, period fields with month precision, and range views that reconcile with reporting, so scheduling data stays trustworthy from form to dashboard.
Get my date handling reviewed