use chrono_tz::{Asia::Tokyo, Europe::London, US::Pacific};
use foxtive_cron::builder::{CronExpression, Weekday};
use std::time::Duration;
fn main() {
println!("=== Advanced Timezone Scheduling Examples ===\n");
println!("1. Multi-region deployment synchronization:");
let us_west = CronExpression::builder()
.daily()
.hour(3)
.with_timezone(Pacific);
let eu_west = CronExpression::builder()
.daily()
.hour(11)
.with_timezone(London);
let asia_east = CronExpression::builder()
.daily()
.hour(20)
.with_timezone(Tokyo);
println!(" US West (Pacific): {} - 3 AM PST", us_west.build());
println!(" EU West (London): {} - 11 AM GMT", eu_west.build());
println!(" Asia East (Tokyo): {} - 8 PM JST", asia_east.build());
println!(" All run at ~11:00 UTC simultaneously\n");
println!("2. DST-safe business hours monitoring:");
let dst_safe = CronExpression::builder()
.weekdays_only()
.hours_range(9, 17)
.minutes_interval(30)
.with_timezone(London);
println!(" Expression: {}", dst_safe.build());
println!(" Automatically adjusts for British Summer Time\n");
println!("3. Global daily report at end of business day:");
let global_report = CronExpression::builder()
.weekdays_only()
.hour(18)
.with_timezone(Pacific);
println!(" Pacific: {} - 6 PM PST/PDT", global_report.build());
println!(" Runs at different UTC times depending on DST\n");
println!("4. Regional maintenance windows (non-overlapping):");
let maintenance_us = CronExpression::builder()
.day_of_week(Weekday::Sunday)
.hour(2)
.with_timezone(Pacific);
let maintenance_eu = CronExpression::builder()
.day_of_week(Weekday::Sunday)
.hour(3)
.with_timezone(London);
let maintenance_asia = CronExpression::builder()
.day_of_week(Weekday::Sunday)
.hour(4)
.with_timezone(Tokyo);
println!(
" US Maintenance: {} - Sunday 2 AM PST",
maintenance_us.build()
);
println!(
" EU Maintenance: {} - Sunday 3 AM GMT",
maintenance_eu.build()
);
println!(
" Asia Maintenance: {} - Sunday 4 AM JST",
maintenance_asia.build()
);
println!(" Staggered to avoid global outage\n");
println!("5. Stock market hours monitoring:");
let nyse = CronExpression::builder()
.weekdays_only()
.hours_range(9, 16)
.minutes_interval(5)
.with_timezone(Pacific);
let lse = CronExpression::builder()
.weekdays_only()
.hours_range(8, 16)
.minutes_interval(5)
.with_timezone(London);
let tse = CronExpression::builder()
.weekdays_only()
.hours_range(9, 15)
.minutes_interval(5)
.with_timezone(Tokyo);
println!(" NYSE (via Pacific): {} - 9 AM-4 PM ET", nyse.build());
println!(" LSE (London): {} - 8 AM-4 PM GMT", lse.build());
println!(" TSE (Tokyo): {} - 9 AM-3 PM JST", tse.build());
println!();
println!("6. Holiday-aware international operations:");
use chrono::NaiveDate;
let intl_ops = CronExpression::builder()
.weekdays_only()
.hours_range(8, 20)
.minutes_interval(60)
.with_timezone(London)
.exclude_date(NaiveDate::from_ymd_opt(2024, 12, 25).unwrap()) .exclude_date(NaiveDate::from_ymd_opt(2024, 12, 26).unwrap()) .exclude_date(NaiveDate::from_ymd_opt(2024, 1, 1).unwrap()) .with_jitter(Duration::from_secs(120));
println!(" Expression: {}", intl_ops.build());
println!(" Blackout dates: Dec 25, Dec 26, Jan 1");
println!(" ±2 minute jitter to distribute load\n");
println!("7. Region-specific data cleanup:");
let cleanup_regions = [
(
"US-East",
CronExpression::builder()
.daily()
.hour(1)
.with_timezone(Pacific)
.build(),
),
(
"EU-West",
CronExpression::builder()
.daily()
.hour(2)
.with_timezone(London)
.build(),
),
(
"Asia-Pac",
CronExpression::builder()
.daily()
.hour(3)
.with_timezone(Tokyo)
.build(),
),
];
for (region, expr) in &cleanup_regions {
println!(" {}: {} - Local midnight cleanup", region, expr);
}
println!();
println!("=== All timezone examples completed! ===");
}