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
📦 What's New in v1.2 & v1.3
✅ v1.2 Updates:
- Added
${}support as an alternative bracket style to{}. - Added new anchor keywords:
first_date_of_this_month— resolves to the first day of the current month.monday_of_this_week— resolves to the Monday of the current week.
✅ v1.3 Updates:
- Added
month=nearest_monthmodifier.- Similar to
year=nearest_year, but applies nearest-month logic. - If the resolved date falls into the future, fallback to previous month (and adjust year if necessary).
- Similar to
- Further improved composability of partial expressions (ex: "11일의 주가 알려줘" →
{today | year=nearest_year, month=nearest_month, day=11}).
✅ v1.3.1 Updates:
- Added new anchor keywords:
first_date_of_this_year— resolves to the first day of the current year.
✅ v1.3.2 Updates:
- Supports for blank after (+/-) sign:
- now supports for
{today + 1d}
- now supports for
📅 DSL Syntax
The general expression format is:
{anchor [+/- offset] | [modifiers]}
Anchors:
today(system reference date)first_date_of_this_yearfirst_date_of_this_monthmonday_of_this_weekYYYYMMDD(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 yearyear_end→ resolves to end of yearyear=nearest_year→ use anchor year, fallback to previous year if resulting date is in the futureyear=YYYY→ explicitly set yearmonth=nearest_month→ anchor month, fallback to previous month if resulting date is in the futuremonth=MM→ override monthday=DD→ override day
📊 Examples
| DSL Expression | Meaning |
|---|---|
{today} |
today's date |
${today} |
today's date |
{today -1d} |
1 day before today |
${today -1d} |
1 day before today |
{today -1y | year_start} |
start of year, 1 year ago |
${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 |
${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) |
${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 |
${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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dateling-1.4.0.tar.gz.
File metadata
- Download URL: dateling-1.4.0.tar.gz
- Upload date:
- Size: 7.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
433694b4cba877209160b882801b59ebaf55a962625138d6aee1c7dfc063afe3
|
|
| MD5 |
7e6ea5c201d7fcf60e382c51b9397a8d
|
|
| BLAKE2b-256 |
09413b4eecb3580721087abc5a54b3efed398257dd23901812c6455b0a5146b8
|
File details
Details for the file dateling-1.4.0-py3-none-any.whl.
File metadata
- Download URL: dateling-1.4.0-py3-none-any.whl
- Upload date:
- Size: 6.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7086c9b109e4da7cf21767d32c50a1c81bee1585180908f468736249088521fd
|
|
| MD5 |
c583edb97d89ac832475c26045bad463
|
|
| BLAKE2b-256 |
64a79aac13a1d555ff64cc6cc0b3b9309c2d5e80c0e0b63194440123e896eb38
|