A cron expression parser and schedule calculator written in MoonBit.
Dependencies
| Syntax | Example | Meaning |
|---|---|---|
| Wildcard | * | Any valid value |
| Value | 5 | One specific value |
| List | 1,3,5 | Any listed value |
| Range | 1-5 | Inclusive range |
| Step | */10 | Every 10 values |
| Range + step | 10-50/5 | Every 5 values from 10 through 50 |
# Standard
minute hour day-of-month month day-of-week
# Extended
second minute hour day-of-month month day-of-weekimport {
"001-Elsa/mooncron@0.1.4"
}import {
"001-Elsa/mooncron" @mooncron,
}let cron = @mooncron.CronExpr::parse("*/15 9-17 * * 1-5")
match cron {
Ok(expr) => {
let now = @mooncron.DateTime::new(2026, 7, 27, 9, 0)
println(expr.matches(now).to_string())
println(expr.describe_en())
println(expr.describe_cn())
for time in expr.next_n(now, 5) {
println(time.to_string())
}
}
Err(err) => println(@mooncron.cron_error_to_string(err))
}pub fn CronExpr::parse(String) -> Result[CronExpr, CronError]
pub fn CronExpr::matches(Self, DateTime) -> Bool
pub fn CronExpr::next_after(Self, DateTime) -> DateTime?
pub fn CronExpr::next_n(Self, DateTime, Int) -> Array[DateTime]
pub fn CronExpr::describe_en(Self) -> String
pub fn CronExpr::describe_cn(Self) -> String
pub fn DateTime::new(Int, Int, Int, Int, Int) -> DateTime
pub fn DateTime::new_with_second(Int, Int, Int, Int, Int, Int) -> DateTime
pub fn DateTime::to_string_with_seconds(Self) -> String
pub fn parse_datetime(String) -> DateTime?
pub fn between(Array[CronField], DateTime, DateTime) -> Array[DateTime]
pub fn count_between(Array[CronField], DateTime, DateTime) -> Int
pub fn prev_before(Array[CronField], DateTime) -> DateTime?
pub fn normalize_expression(String) -> Result[String, CronError]
pub fn are_equivalent(Array[CronField], Array[CronField]) -> Bool# Validate an expression
moon run cmd/main -- check "*/15 9-18 * * 1-5"
# Generate an English description
moon run cmd/main -- explain "0 9 * * 1-5"
# Generate a Chinese description
moon run cmd/main -- describe "0 9 * * 1-5" --cn
# Calculate future execution times
moon run cmd/main -- next "0 9 * * 1-5" --count 5 \
--time "2026-07-25 12:00"
# Match a specific time
moon run cmd/main -- matches "0 9 * * 1-5" \
--time "2026-07-27 09:00"61 * * * * -> invalid minute value 61: expected 0..59
*/0 * * * * -> step value cannot be 0 in field 'minute'
1--5 * * * * -> invalid range syntax in field 'minute'
* * * * * * * -> expected 5 or 6 fields but got 7moon fmt --check
moon check --target all --deny-warn
moon test --target all --deny-warn
moon info
moon packageTotal tests: 151, passed: 151, failed: 0.mooncron/
├── cmd/main/ # CLI package
├── docs/ # Design and syntax documentation
├── *.mbt # Library source files
├── *_test.mbt # Tests
├── moon.mod # Module metadata
├── moon.pkg # Root package configuration
├── ACCEPTANCE.md # Acceptance checklist
├── MoonCron项目申报书.md # Competition application
└── LICENSEpub struct CronBuilder {
seconds : String
minutes : String
hours : String
dom : String
month : String
dow : String
include_seconds : Bool
}pub enum CronErrorKind {
EmptyExpression
WrongFieldCount(Int)
InvalidFieldValue(String)
FieldValueOutOfRange(String, Int, Int, Int)
StepCannotBeZero(String)
InvalidRange(String)
InvalidSyntax(String)
InvalidCharacter(String)
}pub struct DateTime {
year : Int
month : Int
day : Int
hour : Int
minute : Int
second : Int
}pub enum FieldType {
Second
Minute
Hour
DayOfMonth
Month
DayOfWeek
}pub struct FrequencyAnalysis {
per_minute : Int
per_hour : Int
per_day : Int
per_week : Int
per_month : Int
per_year : Int
max_gap_minutes : Int
avg_gap_minutes : Int
}pub enum ScheduleDensity {
VerySparse
Sparse
Moderate
Frequent
Dense
}fn day_of_week(year : Int, month : Int, day : Int) -> Intfn days_in_month(year : Int, month : Int) -> Intfn is_leap_year(year : Int) -> Boolfn is_valid_date(year : Int, month : Int, day : Int) -> Boolfn monthly_at(day : Int, hour : Int, minute : Int) -> Stringfn weekly_at(day_of_week : Int, hour : Int, minute : Int) -> Stringfn yearly_at(month : Int, day : Int, hour : Int, minute : Int) -> StringA cron expression parser and schedule calculator written in MoonBit.
Dependencies