{"record":{"id":"839875018d8878b9","repo":"pola-rs/polars","slug":"out-of-range-in-duration-conversion","errorCode":null,"errorMessage":"out-of-range in duration conversion","messagePattern":"out-of-range in duration conversion","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/polars-arrow/src/temporal_conversions.rs","lineNumber":85,"sourceCode":"    date64_to_datetime(milliseconds).date()\n}\n\n/// converts a `i32` representing a `time32(s)` to [`NaiveTime`]\n#[inline]\npub fn time32s_to_time(v: i32) -> NaiveTime {\n    NaiveTime::from_num_seconds_from_midnight_opt(v as u32, 0).expect(\"invalid time\")\n}\n\n/// converts a `i64` representing a `duration(s)` to [`Duration`]\n#[inline]\npub fn duration_s_to_duration(v: i64) -> Duration {\n    Duration::try_seconds(v).expect(\"out-of-range duration\")\n}\n\n/// converts a `i64` representing a `duration(ms)` to [`Duration`]\n#[inline]\npub fn duration_ms_to_duration(v: i64) -> Duration {\n    Duration::try_milliseconds(v).expect(\"out-of-range in duration conversion\")\n}\n\n/// converts a `i64` representing a `duration(us)` to [`Duration`]\n#[inline]\npub fn duration_us_to_duration(v: i64) -> Duration {\n    Duration::microseconds(v)\n}\n\n/// converts a `i64` representing a `duration(ns)` to [`Duration`]\n#[inline]\npub fn duration_ns_to_duration(v: i64) -> Duration {\n    Duration::nanoseconds(v)\n}\n\n/// converts a `i32` representing a `time32(ms)` to [`NaiveTime`]\n#[inline]\npub fn time32ms_to_time(v: i32) -> NaiveTime {\n    let v = v as i64;","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/pola-rs/polars/blob/fe841f959ef4d2ceefc05a310d33ed7b1ab24e5e/crates/polars-arrow/src/temporal_conversions.rs#L67-L103","documentation":"`duration_ms_to_duration` converts an i64 millisecond value into a chrono `Duration` via `Duration::try_milliseconds`. `try_milliseconds` returns `None` for values outside chrono's representable range, and `.expect(\"out-of-range in duration conversion\")` panics.","triggerScenarios":"Calling `duration_ms_to_duration(v)` with |v| greater than chrono Duration's max (roughly i64::MAX/1000 milliseconds is fine; values near i64::MAX milliseconds exceed the ~±292-year span).","commonSituations":"Treating nanosecond or microsecond epoch values as milliseconds; sentinel values in duration(ms) columns; aggregation results overflowing the duration range.","solutions":["Call `chrono::Duration::try_milliseconds(v)` directly and handle the `None` case instead of the panicking wrapper.","Pre-check |v| against chrono's Duration range before conversion.","Verify the source unit is milliseconds; re-scale if the data is actually us/ns."],"exampleFix":"// before\nlet d = duration_ms_to_duration(v); // panics on huge values\n// after\nlet d = chrono::Duration::try_milliseconds(v)\n    .ok_or_else(|| anyhow!(\"duration ms {v} out of range\"))?;","handlingStrategy":"validation","validationCode":"fn duration_ms_in_range(v: i64) -> bool {\n    chrono::Duration::try_milliseconds(v).is_some()\n}","typeGuard":null,"tryCatchPattern":"match chrono::Duration::try_milliseconds(v) {\n    Some(d) => /* use d */,\n    None => /* handle out-of-range duration */,\n}","preventionTips":["Verify the source unit is milliseconds, not us/ns","Bound-check values against chrono Duration's ~±292-year span","Use the fallible chrono API directly in application code"],"tags":["arrow","chrono","duration","out-of-range"],"backgroundTag":"value-out-of-range","analyzedSha":"fe841f959ef4d2ceefc05a310d33ed7b1ab24e5e","analyzedAt":"2026-09-18T22:14:11.667Z","contentChangedAt":"2026-09-18T22:14:11.667Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}