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-1.0.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-1.0.0-py3-none-any.whl (28.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

See more details on using hashes here.

File details

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

File metadata

  • Download URL: hron-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 28.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","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-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f661a09eafcdb7e6d4a6552f2b1994fe64d4d500d6859ea0c503714bad4e9ced
MD5 746b2904d3337d79283a36699f229856
BLAKE2b-256 2197df458ba9e1648db84a211b5413a5ae96a9c007aebcb20b0ed75bdead6d47

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