Skip to content

v0.4.32

Compare
Choose a tag to compare
@djc djc released this 22 Jan 22:06
· 221 commits to main since this release
v0.4.32

In this release we shipped part of the effort to reduce the number of methods that could unexpectedly panic, notably for the DateTime and Duration types.

Chrono internally stores the value of a DateTime in UTC, and transparently converts it to the local value as required. For example adding a second to a DateTime needs to be done in UTC to get the correct result, but adding a day needs to be done in local time to be correct. What happens when the value is near the edge of the representable range, and the implicit conversions pushes it beyond the representable range? Many methods could panic on such inputs, including formatting the value for Debug output.

In chrono 0.4.32 the range of NaiveDate, NaiveDateTime and DateTime is made slightly smaller. This allows us to always do the implicit conversion, and in many cases return the expected result. Specifically the range is now from January 1, -262144 until December 31, 262143, one year less on both sides than before. We expect this may trip up tests if you hardcoded the MIN and MAX dates.

Duration had a similar issue. The range of this type was pretty arbitrary picked to match the range of an i64 in milliseconds. Negating an i64::MIN pushes a value out of range, and in the same way negating Duration::MIN could push it out of our defined range and cause a panic. This turns out to be somewhat common and hidden behind many layers of abstraction. We adjusted the type to have a minimum value of -Duration::MAX instead and prevent the panic case.

Other highlights:

  • Duration gained new fallible initialization methods.
  • Better support for rkyv.
  • Most methods on NaiveDateTime are now const.
  • We had to bump our MSRV to 1.61 to keep building with our dependencies. This will also allow us to make more methods on DateTime const in a future release.

Complete list of changes:

Fixes

  • Fix panic in TimeZone::from_local_datetime (#1071)
  • Fix out of range panics in DateTime getters and setters (#1317, #1329)

Additions

  • Add NaiveDateTime::checked_(add|sub)_offset (#1313)
  • Add DateTime::to_utc (#1325)
  • Derive Default for Duration (#1327)
  • Add Duration::subsec_nanos (#1327)
  • Add try_* builders to Duration (#1327)
  • Implement AddAssign and SubAssign for Duration (#1327)
  • Make methods on NaiveDateTime const where possible (#1286)
  • Split clock feature into clock and now (#1343, thanks @mmastrac)
  • Add From<NaiveDate> for NaiveDateTime (#1355, thanks @dcechano)
  • Add NaiveDateTime::from_timestamp_nanos (#1357, thanks @Ali-Mirghasemi)
  • Add Months::num_months() and num_years() (#1373, thanks @danwilliams)
  • Add DateTime<Utc>::from_timestamp_millis (#1374, thanks @xmakro)

Changes

  • Fix panic in Duration::MIN.abs() (adjust Duration::MIN by 1 millisecond) (#1334)
  • Bump MSRV to 1.61 (#1347)
  • Update windows-targets requirement from 0.48 to 0.52 (#1360)
  • Update windows-bindgen to 0.52 (#1379)

Deprecations

  • Deprecate standalone format functions (#1306)

Documentation

  • Improve doc comment and tests for timestamp_nanos_opt (#1299, thanks @mlegner)
  • Switch to doc_auto_cfg (#1305, #1326)
  • Document panics in Add/Sub impls and use expect (#1316)
  • Improve types listed in top-level documentation (#1274)
  • Improve deprecation note of TimeZone::datetime_from_str (#1342, thanks @tmccombs)
  • Fix typos in Datelike impl for DateTime (#1376, thanks @ElectrifyPro)

Rkyv support

  • Export Archived* types in rkyv module (#1304)
  • Duplicate derives on Archived* types (#1271, thanks @Awpteamoose)
  • Archive derive of PartialEq for rkyv (#959, thanks @mkatychev)
  • Expose rkyv features as features for chrono users (#1368, thanks @gz)

Changes to unstable features

  • Don't let unstable-locales imply the alloc feature (#1307)
  • Remove format::{format_localized, format_item_localized} (#1311)
  • Inline write_rfc2822_inner, don't localize (#1322)

Internal

  • Add benchmark for DateTime::with_* (#1309)
  • Fix *_DAYS_FROM_YEAR_0 calculation (#1312)
  • Add NaiveTime::overflowing_(add|sub)_offset (#1310)
  • Rewrite DateTime::overflowing_(add|sub)_offset (#1069)
  • Tests calling date command set env LC_ALL (#1315, thanks @jtmoon79)
  • Update deny.toml (#1320)
  • Bump actions/setup-node from 3 to 4 (#1346)
  • test.yml remove errant with: node-version (#1352, thanks @jtmoon79)
  • CI Linting: Fix missing sources checkout in toml job (#1371, thanks @gibbz00)
  • Silence clippy lint for test code with Rust 1.74.0 (#1362)

Thanks to all contributors on behalf of the chrono team, @djc and @pitdicker!