1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#[cfg(feature = "timezones")]
use chrono::TimeZone;
#[cfg(feature = "timezones")]
use chrono_tz::OffsetComponents;
#[cfg(feature = "timezones")]
use polars_arrow::time_zone::Tz;
#[cfg(feature = "timezones")]
use polars_core::prelude::*;
#[cfg(feature = "timezones")]
use polars_core::utils::arrow::temporal_conversions::{
    timestamp_ms_to_datetime, timestamp_ns_to_datetime, timestamp_us_to_datetime,
};
#[cfg(feature = "timezones")]
pub fn base_utc_offset(
    ca: &DatetimeChunked,
    time_unit: &TimeUnit,
    time_zone: &Tz,
) -> DurationChunked {
    let timestamp_to_datetime = match time_unit {
        TimeUnit::Nanoseconds => timestamp_ns_to_datetime,
        TimeUnit::Microseconds => timestamp_us_to_datetime,
        TimeUnit::Milliseconds => timestamp_ms_to_datetime,
    };
    ca.0.apply_values(|t| {
        let ndt = timestamp_to_datetime(t);
        let dt = time_zone.from_utc_datetime(&ndt);
        dt.offset().base_utc_offset().num_milliseconds()
    })
    .into_duration(TimeUnit::Milliseconds)
}