parse_datetime 0.15.0

parsing human-readable time strings and converting them to a Zoned datetime
Documentation
use codspeed_criterion_compat::{criterion_group, criterion_main, Criterion};
use jiff::Zoned;
use parse_datetime::{parse_datetime, parse_datetime_at_date};

fn bench_iso_datetime(c: &mut Criterion) {
    c.bench_function("parse_iso_datetime", |b| {
        b.iter(|| parse_datetime("2021-02-14 06:37:47 +0000"))
    });
}

fn bench_iso_datetime_t_sep(c: &mut Criterion) {
    c.bench_function("parse_iso_datetime_t_separator", |b| {
        b.iter(|| parse_datetime("2021-02-14T22:37:47-0800"))
    });
}

fn bench_date_only(c: &mut Criterion) {
    c.bench_function("parse_date_only", |b| {
        b.iter(|| parse_datetime("1997-01-01"))
    });
}

fn bench_date_slash_format(c: &mut Criterion) {
    c.bench_function("parse_date_slash_format", |b| {
        b.iter(|| parse_datetime("05/07/1987"))
    });
}

fn bench_epoch_timestamp(c: &mut Criterion) {
    c.bench_function("parse_epoch_timestamp", |b| {
        b.iter(|| parse_datetime("@1613371067"))
    });
}

fn bench_relative_time(c: &mut Criterion) {
    let now = Zoned::now();
    c.bench_function("parse_relative_time", |b| {
        b.iter(|| parse_datetime_at_date(now.clone(), "+3 days"))
    });
}

fn bench_relative_time_complex(c: &mut Criterion) {
    let now = Zoned::now();
    c.bench_function("parse_relative_time_complex", |b| {
        b.iter(|| parse_datetime_at_date(now.clone(), "1 year 3 months 2 days ago"))
    });
}

fn bench_relative_keywords(c: &mut Criterion) {
    c.bench_function("parse_yesterday", |b| {
        b.iter(|| parse_datetime("yesterday"))
    });
    c.bench_function("parse_tomorrow", |b| b.iter(|| parse_datetime("tomorrow")));
    c.bench_function("parse_now", |b| b.iter(|| parse_datetime("now")));
}

fn bench_weekday(c: &mut Criterion) {
    c.bench_function("parse_weekday", |b| b.iter(|| parse_datetime("wednesday")));
}

fn bench_timezone_offset(c: &mut Criterion) {
    c.bench_function("parse_timezone_offset", |b| {
        b.iter(|| parse_datetime("UTC+07:00"))
    });
}

fn bench_datetime_with_delta(c: &mut Criterion) {
    c.bench_function("parse_datetime_with_delta", |b| {
        b.iter(|| parse_datetime("1997-01-01 00:00:00 +0000 +1 year"))
    });
}

fn bench_ctime_format(c: &mut Criterion) {
    c.bench_function("parse_ctime_format", |b| {
        b.iter(|| parse_datetime("Wed Jan  1 00:00:00 1997"))
    });
}

fn bench_datetime_with_timezone_name(c: &mut Criterion) {
    c.bench_function("parse_datetime_with_tz_name", |b| {
        b.iter(|| parse_datetime("1997-01-19 08:17:48 BRT"))
    });
}

fn bench_datetime_ending_in_z(c: &mut Criterion) {
    c.bench_function("parse_datetime_ending_in_z", |b| {
        b.iter(|| parse_datetime("2023-06-03 12:00:01Z"))
    });
}

fn bench_invalid_input(c: &mut Criterion) {
    c.bench_function("parse_invalid_input", |b| {
        b.iter(|| parse_datetime("NotADate"))
    });
}

fn bench_extended_year(c: &mut Criterion) {
    c.bench_function("parse_extended_year", |b| {
        b.iter(|| parse_datetime("10000-01-01"))
    });
}

fn bench_extended_year_rollover(c: &mut Criterion) {
    c.bench_function("parse_extended_year_rollover", |b| {
        b.iter(|| parse_datetime("9999-12-31 +1 day"))
    });
}

fn bench_extended_year_relative(c: &mut Criterion) {
    let base = jiff::civil::DateTime::from(jiff::civil::date(2000, 1, 1))
        .to_zoned(jiff::tz::TimeZone::UTC)
        .unwrap();
    c.bench_function("parse_extended_year_relative", |b| {
        b.iter(|| parse_datetime_at_date(base.clone(), "10000-01-01 +1 day"))
    });
}

fn bench_extended_large_year(c: &mut Criterion) {
    c.bench_function("parse_extended_large_year", |b| {
        b.iter(|| parse_datetime("999999-06-15"))
    });
}

criterion_group!(
    benches,
    bench_iso_datetime,
    bench_iso_datetime_t_sep,
    bench_date_only,
    bench_date_slash_format,
    bench_epoch_timestamp,
    bench_relative_time,
    bench_relative_time_complex,
    bench_relative_keywords,
    bench_weekday,
    bench_timezone_offset,
    bench_datetime_with_delta,
    bench_ctime_format,
    bench_datetime_with_timezone_name,
    bench_datetime_ending_in_z,
    bench_invalid_input,
    bench_extended_year,
    bench_extended_year_rollover,
    bench_extended_year_relative,
    bench_extended_large_year,
);
criterion_main!(benches);