use icu::{
calendar::Date,
datetime::{fieldsets, DateTimeFormatter},
locale::locale,
time::{
zone::{IanaParser, TimeZoneVariant, UtcOffset, UtcOffsetCalculator},
Time, ZonedDateTime,
},
};
fn main() -> Result<(), Box<dyn core::error::Error>> {
let ts: jiff::Timestamp = "2024-09-10T23:37:20.123456789Z".parse()?;
let zoned: jiff::Zoned = ts.in_tz("Asia/Tokyo")?;
let date = Date::try_new_iso(
i32::from(zoned.year()),
zoned.month().unsigned_abs(),
zoned.day().unsigned_abs(),
)?;
let time = Time::try_new(
zoned.hour().unsigned_abs(),
zoned.minute().unsigned_abs(),
zoned.second().unsigned_abs(),
u32::from(zoned.millisecond().unsigned_abs()) * 1_000_000
+ u32::from(zoned.microsecond().unsigned_abs()) * 1_000
+ u32::from(zoned.nanosecond().unsigned_abs()),
)?;
let zone =
IanaParser::new().parse(zoned.time_zone().iana_name().unwrap_or_default())
.with_offset(UtcOffset::try_from_seconds(zoned.offset().seconds()).ok())
.at_time((date, time))
.with_zone_variant(TimeZoneVariant::from_rearguard_isdst(zoned.time_zone().to_offset_info(zoned.timestamp()).dst().is_dst()));
let zoned_date_time = ZonedDateTime { date, time, zone };
assert_eq!(
ZonedDateTime::try_from_str(
&zoned.to_string(),
icu::calendar::Iso,
IanaParser::new(),
&UtcOffsetCalculator::new()
)
.unwrap(),
zoned_date_time
);
let prefs = locale!("en-GB-u-ca-japanese").into();
let formatter = DateTimeFormatter::try_new(
prefs,
fieldsets::YMDT::medium().zone(fieldsets::zone::SpecificLong),
)?;
println!("{}", formatter.format(&zoned_date_time));
Ok(())
}