Skip to main content

Human-readable cron — a scheduling expression language that is a superset of cron

Project description

hron

Human-readable cron — scheduling expressions that are a superset of what cron can express.

from hron import Schedule

schedule = Schedule.parse("every weekday at 9:00 in America/New_York")

Install

pip install hron

Usage

from datetime import datetime
from zoneinfo import ZoneInfo
from hron import Schedule

# Parse an expression
schedule = Schedule.parse("every weekday at 9:00 except dec 25, jan 1 in America/New_York")

# Get next occurrence
now = datetime.now(ZoneInfo("America/New_York"))
next_time = schedule.next_from(now)
print(next_time)

# Get next 5 occurrences
upcoming = schedule.next_n_from(now, 5)
for dt in upcoming:
    print(dt)

# Check if a datetime matches
schedule.matches(datetime(2026, 2, 9, 9, 0, tzinfo=ZoneInfo("America/New_York")))  # True

# Convert to/from cron
simple = Schedule.parse("every day at 9:00")
print(simple.to_cron())  # "0 9 * * *"

from_cron = Schedule.from_cron("*/30 * * * *")
print(from_cron)  # "every 30 min from 00:00 to 23:59"

# Validate without exceptions
Schedule.validate("every day at 9:00")  # True
Schedule.validate("invalid")  # False

Expression Syntax

See the full expression reference.

API

Schedule.parse(input: str) -> Schedule

Parse an hron expression string.

Schedule.from_cron(cron_expr: str) -> Schedule

Convert a 5-field cron expression to a Schedule.

Schedule.validate(input: str) -> bool

Check if an input string is a valid hron expression.

schedule.next_from(now: datetime) -> datetime | None

Compute the next occurrence after now.

schedule.next_n_from(now: datetime, n: int) -> list[datetime]

Compute the next n occurrences after now.

schedule.matches(dt: datetime) -> bool

Check if a datetime matches this schedule.

schedule.to_cron() -> str

Convert to a 5-field cron expression. Raises HronError if the schedule can't be expressed as cron.

str(schedule) -> str

Render as the canonical string form (roundtrip-safe).

schedule.timezone -> str | None

The timezone, if specified.

schedule.expression -> ScheduleExpr

The underlying schedule expression AST.

License

MIT

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

hron-0.4.2.tar.gz (17.0 kB view details)

Uploaded Source

Built Distribution

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

hron-0.4.2-py3-none-any.whl (20.7 kB view details)

Uploaded Python 3

File details

Details for the file hron-0.4.2.tar.gz.

File metadata

  • Download URL: hron-0.4.2.tar.gz
  • Upload date:
  • Size: 17.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.2 {"installer":{"name":"uv","version":"0.10.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for hron-0.4.2.tar.gz
Algorithm Hash digest
SHA256 bb411b07276a606dac2f9ff3eba6ee3bcedab549f1077ccecb181942dd76919e
MD5 083f531cfebc60c7f57abe254baf2b07
BLAKE2b-256 263b9e1066701c55ecb736e11267692b1d33c89f25720fd868c59d566ccfde2c

See more details on using hashes here.

File details

Details for the file hron-0.4.2-py3-none-any.whl.

File metadata

  • Download URL: hron-0.4.2-py3-none-any.whl
  • Upload date:
  • Size: 20.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.2 {"installer":{"name":"uv","version":"0.10.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for hron-0.4.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f6d82ed21f6cad5f87467221d07c6a95fd02c837b8ea2ecd11802046a09a8efc
MD5 717a30b56eea316ec6f63110f8b594cf
BLAKE2b-256 ab1abace3b14dd3702fe5ca8405c9bfcdb5f7fc331a4b079632e58f5675df9db

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