Skip to main content

dateling provides a normalized formal language and grammar for handling relative time expressions. It includes a DSL (domain-specific language) to represent time anchors, offsets, and modifiers, along with a robust parser and resolver to evaluate these expressions into concrete dates. The name 'dateling' comes from combining 'date' and 'handling', reflecting its purpose of handling complex date computations

Project description

dateling

🕰 dateling — A Time Expression DSL and parser for deterministic date calculations.

dateling provides a normalized formal language (DSL) to represent and resolve date calculations using structured expressions.
Instead of parsing ambiguous natural language, it offers a precise syntax to express relative and absolute dates, compute date ranges, and perform robust date arithmetic.

The name dateling comes from combining date and handling.


🚀 Why dateling?

Most existing packages like dateparser or parsedatetime try to interpret free-text natural language into dates.
In contrast, dateling takes a strict, declarative, and composable approach, offering:

  • ✅ Predictable & reproducible date evaluation
  • ✅ Fully composable date expressions
  • ✅ Explicit syntax without ambiguity
  • ✅ Ideal for any system requiring controlled time range calculations
  • ✅ No natural language processing — purely deterministic time logic

📅 DSL Syntax

The general expression format is:

{anchor [+/- offset] | [modifiers]}

Anchors:

  • today (system reference date)
  • YYYYMMDD (e.g. 20250101)
  • YYYY-MM-DD (e.g. 2025-01-01)

Offsets:

  • Days: +Nd, -Nd
  • Months: +Nm, -Nm
  • Years: +Ny, -Ny

Modifiers:

  • year_start → resolves to start of year
  • year_end → resolves to end of year
  • year=nearest_year → use anchor year, fallback to previous year if resulting date is in the future
  • year=YYYY → explicitly set year
  • month=MM → override month
  • day=DD → override day

📊 Examples

DSL Expression Meaning
{today} today's date
{today -1d} 1 day before today
{today -1y | year_start} start of year, 1 year ago
{2025-01-01 +30y | year_end} year-end of 30 years after Jan 1, 2025
{today | year=nearest_year, month=03, day=10} resolves to March 10 of anchor year (or previous year if future)
{year=2023, month=05, day=15} absolute date

🔬 Evaluation Example (Reference date: 2025-06-11)

DSL Output
{today} 2025-06-11
{today -1d} 2025-06-10
{today -365d | year=nearest_year} 2024-06-11
{today -3y} 2022-06-11
{today | year_start} 2025-01-01
{today | year_end} 2025-12-31
{today -1y | year_start} 2024-01-01
{today -1y | year_end} 2024-12-31
{today | year=nearest_year, month=06, day=10} 2025-06-10
{today -1y | year=nearest_year, month=03, day=10} 2024-03-10
{today | year=2024, month=06, day=10} 2024-06-10
{year=2022, month=05, day=15} 2022-05-15
2025-01-01 2025-01-01
20250101 2025-01-01
{1000-01-01 +30y | year_end} 1030-12-31
{today -36m} 2022-06-11

⚙ Usage

from dateling import DatelingResolver

resolver = DatelingResolver()
date = resolver.resolve("{today -1y | year_start}")
print(date)

You may also set a fixed reference date:

resolver = DatelingResolver(reference_date="2025-06-11")
date = resolver.resolve("{today -3y | year_end}")
print(date)

📦 Installation

pip install dateling

(Once released to PyPI)


🔧 Design Philosophy

  • 🧮 Formal expression language for time calculation
  • 🔎 Fully deterministic, reproducible, and testable
  • 🏷 No AI or natural language guessing
  • 📈 Applicable across scheduling, reporting, ETL, search systems, financial applications, etc.

📄 License

MIT License


🔗 Related Alternatives

Package Approach Difference from dateling
dateparser Natural language parsing No DSL, free-text interpretation
parsedatetime Human language parsing No formal syntax, heuristic parsing
textX Generic DSL builder Requires custom DSL grammar creation
dateling DSL-based date expression language Strict syntax for controlled date calculations

🧭 dateling: When you want to write date calculations, not guess them.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dateling-1.0.1.tar.gz (4.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dateling-1.0.1-py3-none-any.whl (4.6 kB view details)

Uploaded Python 3

File details

Details for the file dateling-1.0.1.tar.gz.

File metadata

  • Download URL: dateling-1.0.1.tar.gz
  • Upload date:
  • Size: 4.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.11

File hashes

Hashes for dateling-1.0.1.tar.gz
Algorithm Hash digest
SHA256 14b657a659f1c64a55c8699216b286e35231fe034ad347f65eb4cb39f3a99d72
MD5 3416d6878bb28c9b855eece91ef85a5e
BLAKE2b-256 9097e7f43cdb10985905ecaa5b822c1a0a28c46f536f91906d916178a03e9856

See more details on using hashes here.

File details

Details for the file dateling-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: dateling-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 4.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.11

File hashes

Hashes for dateling-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 51026b702fdb10eee135752b38f93ea4f4c827011ea2b1b677c8de7382848a2e
MD5 78d30bfd19441eecfb18358eea59237d
BLAKE2b-256 03fd70040b9917e4ddaa2f65e720b1397f5b5315b1d04c029ecd88dc0b0f5737

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page