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.6.0.tar.gz (24.8 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.6.0-py3-none-any.whl (28.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: hron-0.6.0.tar.gz
  • Upload date:
  • Size: 24.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.3 {"installer":{"name":"uv","version":"0.10.3","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.6.0.tar.gz
Algorithm Hash digest
SHA256 eb764e8ab0a94e7f0cbd1ff46434a7b1b5544b85c098452c9eee05f462f47ab4
MD5 a88915ec835608cff506c74eeecd2352
BLAKE2b-256 d382fc9cc7f0229852a48d32ea5233fa4dd136865971523f27b2f3d98a5b97dd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hron-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 28.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.3 {"installer":{"name":"uv","version":"0.10.3","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.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5ca3161c48fa61a2c3caccd43b067eb10b8bcf3b3e1165182b4fda85274be514
MD5 7a603f67403da5c2a993f04d0ccc71d1
BLAKE2b-256 a67e5fe4c574ec1988399509ae78fef0ce4eb53482d41b24f317c4ead7fea961

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