This documents notable changes to Chrono up to and including version 0.4.19. For later releases, please review the release notes on GitHub.
Add %Z specifier to the FromStr, similar to the glibc strptime (does not set the offset from the timezone name)
Drop the dependency on time v0.1, which is deprecated, unless the oldtime feature is active. This feature is active by default in v0.4.16 for backwards compatibility, but will likely be removed in v0.5. Code that imports time::Duration should be switched to import chrono::Duration instead to avoid breakage.
NaiveDate (@gnzlbg & @robyoung)Month enum (@hhamana)locales. All format functions can now use locales, see the documentation for the unstable-locales feature.Local.from_local_datetime method for wasmNaiveTime, NaiveDateTime and DateTime<Utc>.DurationRound trait that allows rounding and truncating by Duration (@robyoung)From for js_sys in wasm to reuse code (@schrieveslaach)Duration::abs to ensure that a duration is just a magnitude (#418 @abreis).From for js_sys in wasm (#424 @schrieveslaach)time for redox support.Option types (#417 @mwkroening and #429 @fx-kirin)T in FromStr for DateTime<Tz>, meaning that e.g. dt.to_string().parse::<DateTime<Utc>>() now correctly works on round-trip. (@quodlibetor in #378)parse_from_rfc2822 (@quodlibetor #368 reported in #102)Error::description (@AnderEnder and @quodlibetor #376)alloc feature to improve no-std support (in #341) means that if you were relying on chrono with no-default-features and using any of the functions that require alloc support (i.e. any of the string-generating functions like to_rfc3339) you will need to add the alloc feature in your Cargo.toml.DateTime::parse_from_str is more than 2x faster in some cases. (@michalsrb #358)Iterator of Items (for example format_with_items) now accept Iterator of Borrow<Item>, so one can use values or references. (@michalsrb #358)Option<Datetime> etc fields (@manifest #302)strftime docs page (@qudlibetor #359)try! -> ? (question mark) because it is now emitting deprecation warnings and has been stable since rustc 1.13.0wasmbind feature gate. (@quodlibetor #335)wasm-unknown-unknown via wasm-bindgen (in addition to emscripten/wasm-unknown-emscripten). (finished by @evq in #331, initial work by @jjpe #287)LocalResult Copy/Eq/Hashstd::convert::From conversions between the different timezone formats (@mqudsi #271)timestamp_nanos methods (@jean-airoldie #308)NaiveDate::from_weekday_of_month{,_opt} for getting eg. the 2nd Friday of March 2017.Hash on FixedOffset (@LuoZijun #254)clock feature, for use in environments where we don't have access to the current time. (@jethrogb #236)Dates, Times, or DateTimes, returning a Duration (@tobz1000 #237)timestamp_millis method on DateTime and NaiveDateTim that returns number of milliseconds since the epoch. (@quodlibetor)to_rfc3339_opts method on DateTime (@dekellum)SubsecRound trait that allows rounding to the nearest second (@dekellum)This was originally planned as a minor release but was pushed to a major release due to the compatibility concern raised.
IsoWeek has been added for the ISO week without time zone.
The += and -= operators against time::Duration are now supported for NaiveDate, NaiveTime and NaiveDateTime. (#99)
(Note that this does not invalidate the eventual deprecation of time::Duration.)
SystemTime and DateTime<Tz> types can be now converted to each other via From. Due to the obvious lack of time zone information in SystemTime, the forward direction is limited to DateTime<Utc> and DateTime<Local> only.
Intermediate implementation modules have been flattened (#161), and UTC has been renamed to Utc in accordance with the current convention (#148).
The full list of changes is as follows:
| Before | After |
|---|---|
chrono::date::Date | chrono::Date |
chrono::date::MIN | chrono::MIN_DATE |
chrono::date::MAX | chrono::MAX_DATE |
chrono::datetime::DateTime | chrono::DateTime |
chrono::naive::time::NaiveTime | chrono::naive::NaiveTime |
chrono::naive::date::NaiveDate | chrono::naive::NaiveDate |
chrono::naive::date::MIN | chrono::naive::MIN_DATE |
chrono::naive::date::MAX | chrono::naive::MAX_DATE |
chrono::naive::datetime::NaiveDateTime | chrono::naive::NaiveDateTime |
chrono::offset::utc::UTC | chrono::offset::Utc |
chrono::offset::fixed::FixedOffset | chrono::offset::FixedOffset |
chrono::offset::local::Local | chrono::offset::Local |
chrono::format::parsed::Parsed | chrono::format::Parsed |
With an exception of Utc, this change does not affect any direct usage of chrono::* or chrono::prelude::* types.
Datelike::isoweekdate is replaced by Datelike::iso_week which only returns the ISO week.
The original method used to return a tuple of year number, week number and day of the week, but this duplicated the Datelike::weekday method and it had been hard to deal with the raw year and week number for the ISO week date. This change isolates any logic and API for the week date into a separate type.
NaiveDateTime and DateTime can now be deserialized from an integral UNIX timestamp. (#125)
This turns out to be very common input for web-related usages. The existing string representation is still supported as well.
chrono::serde and chrono::naive::serde modules have been added for the serialization utilities. (#125)
Currently they contain the ts_seconds modules that can be used to serialize NaiveDateTime and DateTime values into an integral UNIX timestamp. This can be combined with Serde's [de]serialize_with attributes to fully support the (de)serialization to/from the timestamp.
For rustc-serialize, there are separate chrono::TsSeconds and chrono::naive::TsSeconds types that are newtype wrappers implementing different (de)serialization logics. This is a suboptimal API, however, and it is strongly recommended to migrate to Serde.
The major version was made to fix the broken Serde dependency issues. (#146, #156, #158, #159)
The original intention to technically break the dependency was to facilitate the use of Serde 1.0 at the expense of temporary breakage. Whether this was appropriate or not is quite debatable, but it became clear that there are several high-profile crates requiring Serde 0.9 and it is not feasible to force them to use Serde 1.0 anyway.
To the end, the new major release was made with some known lower-priority breaking changes. 0.3.1 is now yanked and any remaining 0.3 users can safely roll back to 0.3.0.
Various documentation fixes and goodies. (#92, #131, #136)
Weekday now implements FromStr, Serialize and Deserialize. (#113)
The syntax is identical to %A, i.e. either the shortest or the longest form of English names.
Serde 1.0 is now supported. (#142)
This is technically a breaking change because Serde 0.9 and 1.0 are not compatible, but this time we decided not to issue a minor version because we have already seen Serde 0.8 and 0.9 compatibility problems even after 0.3.0 and a new minor version turned out to be not very helpful for this kind of issues.
The project has moved to the Chronotope organization.
chrono::prelude module has been added. All other glob imports are now discouraged.
FixedOffset can be added to or subtracted from any timelike types.
FixedOffset::local_minus_utc and FixedOffset::utc_minus_local methods have been added. Note that the old Offset::local_minus_utc method is gone; see below.Serde support for non-self-describing formats like Bincode is added. (#89)
Added Item::Owned{Literal,Space} variants for owned formatting items. (#76)
Formatting items and the Parsed type have been slightly adjusted so that they can be internally extended without breaking any compatibility.
Weekday is now Hashable. (#109)
ParseError now implements Eq as well as PartialEq. (#114)
More documentation improvements. (#101, #108, #112)
Chrono now only supports Rust 1.13.0 or later (previously: Rust 1.8.0 or later).
Serde 0.9 is now supported. Due to the API difference, support for 0.8 or older is discontinued. (#122)
Rustc-serialize implementations are now on par with corresponding Serde implementations. They both standardize on the std::fmt::Debug textual output.
This is a silent breaking change (hopefully the last though). You should be prepared for the format change if you depended on rustc-serialize.
Offset::local_minus_utc is now Offset::fix, and returns FixedOffset instead of a duration.
This makes every time zone operation operate within a bias less than one day, and vastly simplifies many logics.
chrono::format::format now receives FixedOffset instead of time::Duration.
The following methods and implementations have been renamed and older names have been removed. The older names will be reused for the same methods with std::time::Duration in the future.
checked_* → checked_*_signed in Date, DateTime, NaiveDate and NaiveDateTime types
overflowing_* → overflowing_*_signed in the NaiveTime type
All subtraction implementations between two time instants have been moved to signed_duration_since, following the naming in std::time.
Local offset receives a leap second. (#123)Rustc-serialize support for Date<Tz> types and all offset types has been dropped.
These implementations were automatically derived and never had been in a good shape. Moreover there are no corresponding Serde implementations, limiting their usefulness. In the future they may be revived with more complete implementations.
The following method aliases deprecated in the 0.2 branch have been removed.
DateTime::num_seconds_from_unix_epoch (→ DateTime::timestamp)NaiveDateTime::from_num_seconds_from_unix_epoch (→ NaiveDateTime::from_timestamp)NaiveDateTime::from_num_seconds_from_unix_epoch_opt (→ NaiveDateTime::from_timestamp_opt)NaiveDateTime::num_seconds_unix_epoch (→ NaiveDateTime::timestamp)Formatting items are no longer Copy, except for chrono::format::Pad.
chrono::offset::add_with_leapsecond has been removed. Use a direct addition with FixedOffset instead.
This is the last version officially supports Rust 1.12.0 or older.
(0.2.24 was accidentally uploaded without a proper check for warnings in the default state, and replaced by 0.2.25 very shortly. Duh.)
The documentation was greatly improved for several types, and tons of cross-references have been added. (#77, #78, #80, #82)
DateTime::timestamp_subsec_{millis,micros,nanos} methods have been added. (#81)
When the system time records a leap second, the nanosecond component was mistakenly reset to zero. (#84)
Local offset misbehaves in Windows for August and later, due to the long-standing libtime bug (dates back to mid-2015). Workaround has been implemented. (#85)
%.6f and %.9f used to print only three digits when the nanosecond part is zero. (#71)%+ has been updated to reflect the current status. (#71)Fixed::LongWeekdayName was unable to recognize "sunday" (whoops). (#66)serde dependency has been updated to 0.7. (#63, #64)Date is made clear about its ambiguity and guarantees.DateTime::date had been wrong when the local date and the UTC date is in disagreement. (#61)rand dependency. (#57)DateTime now have a serde support. They serialize as an ISO 8601 / RFC 3339 string just like Debug. (#51)%.3f, %.6f and %.9f specifier for formatting fractional seconds up to 3, 6 or 9 decimal digits. This is a natural extension to the existing %f. Note that this is (not yet) generic, no other value of precision is supported. (#45)Datelike and Timelike. This does not make a big harm as any type implementing them should be already sized to be practical, but this change still can break highly generic codes. (#46)README.md. (#41)Padding modifiers %_?, %-? and %0? are implemented. They are glibc extensions which seem to be reasonably widespread (e.g. Ruby).
Added %:z specifier and corresponding formatting items which is essentially the same as %z but with a colon.
Added a new specifier %.f which precision adapts from the input. This was added as a response to the UX problems in the original nanosecond specifier %f.
Numeric::Timestamp specifier (%s) was ignoring the time zone offset when provided.
Improved the documentation and associated tests for strftime.
NaiveDateTime +/- Duration or NaiveTime +/- Duration could have gone wrong when the Duration to be added is negative and has a fractional second part. This was caused by an underflow in the conversion from Duration to the parts; the lack of tests for this case allowed a bug. (#37)rustc_serialize and relevant Rustc{En,De}codable implementations for supported types has been added. This is enabled by the rustc-serialize Cargo feature. (#34)chrono::Duration reexport is changed to that of crates.io time crate. This enables Rust 1.0 beta compatibility.Date<Tz> and fixed unwanted conversion problem that only occurs with positive UTC offsets. (#27)DateTime<Tz> and Date<Tz> is now Copy/Send when Tz::Offset is Copy/Send. The implementations for them were mistakenly omitted. (#25)Local::from_utc_datetime didn't set a correct offset. (#26)DelayedFormat no longer conveys a redundant lifetime.Offset is splitted into TimeZone (constructor) and Offset (storage) types. You would normally see only the former, as the latter is mostly an implementation detail. Most importantly, Local now can be used to directly construct timezone-aware values.
Some types (currently, UTC and FixedOffset) are both TimeZone and Offset, but others aren't (e.g. Local is not what is being stored to each DateTime values).
LocalResult::map convenience method has been added.
TimeZone now allows a construction of DateTime values from UNIX timestamp, via timestamp and timestamp_opt methods.
TimeZone now also has a method for parsing DateTime, namely datetime_from_str.
The following methods have been added to all date and time types:
checked_addchecked_subformat_with_itemsThe following methods have been added to all timezone-aware types:
timezonewith_timezonenaive_utcnaive_localparse_from_str method has been added to all naive types and DateTime<FixedOffset>.
All naive types and instances of DateTime with time zones UTC, Local and FixedOffset implement the FromStr trait. They parse what std::fmt::Debug would print.
chrono::format has been greatly rewritten.
The formatting syntax parser is modular now, available at chrono::format::strftime.
The parser and resolution algorithm is also modular, the former is available at chrono::format::parse while the latter is available at chrono::format::parsed.
Explicit support for RFC 2822 and 3339 syntaxes is landed.
There is a minor formatting difference with atypical values, e.g. for years not between 1 BCE and 9999 CE.
Most uses of Offset are converted to TimeZone. In fact, all user-facing code is expected to be Offset-free.
[Naive]DateTime::*num_seconds_from_unix_epoch* methods have been renamed to simply timestamp or from_timestamp*. The original names have been deprecated.
Time has been removed. This also prompts a related set of methods in TimeZone.
This is in principle possible, but in practice has seen a little use because it can only be meaningfully constructed via an existing DateTime value. This made many operations to Time unintuitive or ambiguous, so we simply let it go.
In the case that Time is really required, one can use a simpler NaiveTime. NaiveTime and NaiveDate can be freely combined and splitted, and TimeZone::from_{local,utc}_datetime can be used to convert from/to the local time.
with_offset method has been removed. Use with_timezone method instead. (This is not deprecated since it is an integral part of offset reform.)
std::fmt::String impl for Local.std::fmt::Show and std::fmt::String, with the former used for the stricter output and the latter used for more casual output.Offset::name has been replaced by a std::fmt::String implementation to Offset.Duration + T no longer works due to the updated impl reachability rules. Use T + Duration as a workaround.Date::and_* methods with an offset that can change the date are off by one day.{Date,Time,DateTime}::with_offset methods have been added.
LocalResult now implements a common set of traits.
LocalResult::and_* methods have been added. They are useful for safely chaining LocalResult<Date<Off>> methods to make LocalResult<DateTime<Off>>.
Offset::name now returns SendStr.
{Date,Time} - Duration overloadings are now allowed.
Duration + Date overloading is now allowed.num dependency.The initial version that was available to crates.io.