cron-parser 0.11.2

Library for parsing cron expressions with timezone support.
Documentation
use chrono::Utc;
use cron_parser::parse;

fn main() {
    let title = "Common Cron Expression Patterns";
    println!("{title}");
    println!("{}", "-".repeat(title.len()));
    println!();

    let now = Utc::now();
    println!("Current time: {}", now.format("%Y-%m-%d %H:%M:%S %Z"));
    println!();

    let patterns = vec![
        ("* * * * *", "Every minute"),
        ("*/5 * * * *", "Every 5 minutes"),
        ("*/15 * * * *", "Every 15 minutes"),
        ("0 * * * *", "Every hour (at minute 0)"),
        ("0 */2 * * *", "Every 2 hours"),
        ("0 0 * * *", "Daily at midnight"),
        ("0 2 * * *", "Daily at 2:00 AM"),
        ("0 9 * * 1-5", "Weekdays at 9:00 AM"),
        ("0 0 * * 0", "Weekly on Sunday at midnight"),
        ("0 0 1 * *", "Monthly on the 1st at midnight"),
        ("0 0 1 1 *", "Yearly on January 1st at midnight"),
        ("0 9,17 * * *", "Daily at 9:00 AM and 5:00 PM"),
        ("30 9 * * Mon-Fri", "Weekdays at 9:30 AM"),
        ("0 12-18/2 * * *", "Every 2 hours between 12:00 and 18:00"),
        (
            "0 12-18/3 * * *",
            "Every 3 hours between 12:00 and 18:00 (12:00, 15:00, 18:00)",
        ),
        (
            "*/10 9-17 * * 1-5",
            "Every 10 minutes during business hours (9-5, Mon-Fri)",
        ),
        ("0 0 */3 * *", "Every 3 days at midnight"),
        ("0 0,12 * * *", "Twice a day at midnight and noon"),
        ("15 2 * * 6", "Every Saturday at 2:15 AM"),
    ];

    for (pattern, description) in patterns {
        print_pattern(&now, pattern, description);
    }

    println!();
    println!("Tip: Use 'just run-example \"<pattern>\" --count 10' to see more occurrences");
}

fn print_pattern(now: &chrono::DateTime<chrono::Utc>, pattern: &str, description: &str) {
    match parse(pattern, now) {
        Ok(next) => {
            println!("{description:<30} {pattern}");
            println!("  Next: {}", next.format("%Y-%m-%d %H:%M:%S %Z"));
            println!();
        }
        Err(e) => {
            println!("{description:<30} {pattern}");
            println!("  Error: {e:?}");
            println!();
        }
    }
}