makeplane/plane · error · ValueError
Invalid date format: {value}
Error message
Invalid date format: {value} What it means
ValueError raised in `_process_date_field` (converters.py:280) when `strict=True` and a simple (no ';') date value fails `_validate_date`, which uses dateutil's parser. It only fires in strict mode; non-strict skips the value. The bad value is interpolated into the message.
Source
Thrown at apps/api/plane/utils/filters/converters.py:280
if len(parts) > 0 and self.DATE_PATTERN.match(parts[0]):
# Skip relative date patterns entirely
return {}
# Skip complex conditions (more than 2 values)
if len(values) > 2:
return {}
# Process each date value
exact_dates = []
after_dates = []
before_dates = []
for value in values:
if ";" not in value:
# Simple date string
if not self._validate_date(value):
if strict:
raise ValueError(f"Invalid date format: {value}")
continue
exact_dates.append(value)
else:
# Directional date - only handle basic after/before
parts = value.split(";")
if len(parts) < 2:
if strict:
raise ValueError(f"Invalid date format: {value}")
continue
date_part = parts[0]
direction = parts[1]
if not self._validate_date(date_part):
if strict:
raise ValueError(f"Invalid date format: {date_part}")
continue
View on GitHub (pinned to 1c8a60f858)
Solutions
- Send dates in ISO 8601 (YYYY-MM-DD) which dateutil reliably parses.
- Disable strict mode (strict=False) to skip invalid date values instead of raising.
- Pre-validate each date with dateutil.parser.parse client-side before submitting the filter.
- Strip whitespace and non-printable characters from pasted date strings.
Example fix
# before
filters = {"target_date": ["not-a-date"]}
converter.convert(filters, strict=True) # raises
# after
filters = {"target_date": ["2024-08-12"]}
converter.convert(filters, strict=True) Defensive patterns
Strategy: validation
Validate before calling
from dateutil.parser import parse as dateutil_parse
def is_parseable_date(value: str) -> bool:
# mirrors converters.py _validate_date for strings
try:
dateutil_parse(value); return True
except (ValueError, TypeError):
return False Try / catch
try:
converter.convert(filters, strict=True)
except ValueError as e:
if 'Invalid date format' in str(e):
reject_bad_dates(e) Prevention
- Send ISO 8601 dates (YYYY-MM-DD).
- Use strict=False to tolerate and skip bad dates during migrations.
- Pre-parse each date with dateutil before submitting.
When it happens
Trigger: Calling the legacy-to-rich filter converter with strict=True and a date filter value that dateutil cannot parse - e.g. '2024-13-99', 'not-a-date', 'tomorrow', or a locale-formatted string dateutil rejects. Single (non-directional) date values hit this branch.
Common situations: Migrating legacy filter payloads with strict validation enabled; client sending free-text instead of ISO dates; locale-specific formats dateutil does not accept by default; copy-paste from spreadsheets with invisible characters.
Related errors
- Invalid date format: {date_part}
- Filter validation errors: {'; '.join(validation_errors)}
- Invalid expression: empty or null data
- AND group must contain at least one condition
- Invalid expression: unknown structure with keys [${expressio
AI-assisted analysis of makeplane/plane@1c8a60f858 (2026-08-12).
Data as JSON: /api/errors/6253d937262b74ba.
Report an issue: GitHub.