CronstrueEx
CronstrueEx is an Elixir library that converts cron expressions into clear, human-readable descriptions.
It follows the behavior and public options of the npm package cRonstrue as closely as practical, while providing an idiomatic Elixir API and no runtime dependencies.
Important
CronstrueEx is under active development. The current release implements a useful subset of cRonstrue, but compatibility is not complete and the API may change before the first stable release. The package is not published on Hex yet.
Current functionality
- Standard five-field cron expressions: minute, hour, day of month, month, and day of week.
- Numeric values, wildcards, lists, ranges, and increments.
- Case-insensitive three-letter English month and weekday names such as
JANandMON. - Human-readable descriptions in English and Spanish.
- Locale-specific clock defaults: English uses 12 hours and Spanish uses 24 hours.
- Concise and verbose descriptions.
- Configurable hour formatting and parse-error handling.
- Validation of the syntax and ranges currently supported by the parser.
Usage
English is the default locale:
CronstrueEx.to_string("* * * * *")
# => "Every minute"
CronstrueEx.to_string("*/5 * * * *")
# => "Every 5 minutes"
CronstrueEx.to_string("30 11 * * 1-5")
# => "At 11:30 AM, Monday through Friday"
CronstrueEx.to_string("23 12 15 Jan-Mar *")
# => "At 12:23 PM, on day 15 of the month, January through March"
Select Spanish with locale: "es" or locale: :es:
CronstrueEx.to_string("*/5 * * * *", locale: "es")
# => "Cada 5 minutos"
CronstrueEx.to_string("30 23 * * MON-FRI", locale: :es)
# => "A las 23:30, de lunes a viernes"
Supported syntax
| Syntax | Example | Meaning |
|---|---|---|
| Wildcard | * * * * * | Every minute |
| Value | 30 11 * * * | At 11:30 AM |
| List | 0 9,17 * * * | At 9:00 AM and 5:00 PM |
| Range | 0 9-17 * * * | Every hour from 9:00 AM to 5:00 PM |
| Increment | */10 * * * * | Every 10 minutes |
| Named range | 30 11 * * MON-FRI | At 11:30 AM, Monday through Friday |
Names are accepted only in English in the cron expression, regardless of the
output locale. For example, use MON-FRI when requesting either English or
Spanish output.
Options
Options are passed as a keyword list to CronstrueEx.to_string/2:
| Option | Default | Description |
|---|---|---|
:locale | "en" | Output language: "en", :en, "es", or :es |
:verbose | false | Includes wording normally omitted for brevity |
:use_24_hour_time_format | Locale default | Overrides the locale's clock format |
:trim_hours_leading_zero | false | Removes a leading zero from formatted hours |
:throw_exception_on_parse_error | true | Raises on invalid input when enabled |
For example:
CronstrueEx.to_string("30 22 * * *", use_24_hour_time_format: true)
# => "At 22:30"
CronstrueEx.to_string("* * * * *", verbose: true)
# => "Every minute, every hour, every day"
Invalid expressions raise CronstrueEx.ParseError by default. A localized
generic message can be returned instead:
CronstrueEx.to_string("invalid", locale: "es", throw_exception_on_parse_error: false)
# => "Ocurrió un error mientras se generaba la descripción de la expresión. Revise la sintaxis de la expresión de cron."
Current limitations
- Only five-field expressions are supported.
- Seconds and year fields are not supported.
- Quartz syntax such as
?,L,W, and#is not supported. - Cron nicknames such as
@daily,@weekly, and@rebootare not supported. - Some complex combinations may not yet produce exactly the same description as cRonstrue.
- CronstrueEx describes schedules; it does not calculate future executions or run scheduled jobs.
Roadmap
Planned work includes broader parity for five-field expressions, six- and seven-field expressions, cron nicknames, Quartz syntax, additional formatting options, and more locales. Features will be added incrementally with compatibility tests derived from cRonstrue v3.24.0.
Requirements
- Elixir 1.14 or later
Installation
CronstrueEx is not available on Hex yet. Once published, it is expected to be
installed by adding it to the dependencies in mix.exs:
def deps do
[
{:cronstrue_ex, "~> 0.1.0"}
]
end
Until then, clone the repository to try or contribute to the project.
Development
Run the test suite:
mix test
Check formatting and compile with warnings treated as errors:
mix format --check-formatted
mix compile --warnings-as-errors
License
CronstrueEx is released under the MIT License. See LICENSE for details. Its behavior and parts of its locale wording are based on the MIT-licensed cRonstrue project.