diff --git a/CHANGELOG.md b/CHANGELOG.md index f27646d..5b87012 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,32 @@ Chrono obeys the principle of [Semantic Versioning](http://semver.org/). There were/are numerous minor versions before 1.0 due to the language changes. Versions with only mechnical changes will be omitted from the following list. +## 0.4.1 + +### Bug Fixes + +* Allow parsing timestamps with subsecond precision (@jonasbb) +* RFC2822 allows times to not include the second (@upsuper) + +### Features + +* New `timestamp_millis` method on `DateTime` and `NaiveDateTim` that returns + number of milliseconds since the epoch. (@quodlibetor) +* Support exact decimal width on subsecond display for RFC3339 via a new + `to_rfc3339_opts` method on `DateTime` (@dekellum) +* Use no_std-compatible num dependencies (@cuviper) +* Add `SubsecRound` trait that allows rounding to the nearest second + (@dekellum) + +### Code Hygiene and Docs + +* Docs! (@alatiera @kosta @quodlibetor @kennytm) +* Run clippy and various fixes (@quodlibetor) + ## 0.4.0 (2017-06-22) -This was originally planned as a minor release but was pushed to a major release -due to the compatibility concern raised. +This was originally planned as a minor release but was pushed to a major +release due to the compatibility concern raised. ### Added diff --git a/Cargo.toml b/Cargo.toml index 713207b..731f11b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chrono" -version = "0.4.0" +version = "0.4.1" authors = ["Kang Seonghoon "] description = "Date and time library for Rust" diff --git a/src/datetime.rs b/src/datetime.rs index 36fd160..ec5e85a 100644 --- a/src/datetime.rs +++ b/src/datetime.rs @@ -18,6 +18,8 @@ use format::{parse, Parsed, ParseError, ParseResult, DelayedFormat, StrftimeItem /// Specific formatting options for seconds. This may be extended in the /// future, so exhaustive matching in external code is not recommended. +/// +/// See the `TimeZone::to_rfc3339_opts` function for usage. #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum SecondsFormat { /// Format whole seconds only, with no decimal point nor subseconds. @@ -39,6 +41,10 @@ pub enum SecondsFormat { /// display all available non-zero sub-second digits. This corresponds to /// [Fixed::Nanosecond](format/enum.Fixed.html#variant.Nanosecond). AutoSi, + + // Do not match against this. + #[doc(hidden)] + __NonExhaustive, } /// ISO 8601 combined date and time with time zone. @@ -300,6 +306,8 @@ impl DateTime where Tz::Offset: fmt::Display { use format::Pad::Zero; use SecondsFormat::*; + debug_assert!(secform != __NonExhaustive, "Do not use __NonExhaustive!"); + const PREFIX: &'static [Item<'static>] = &[ Item::Numeric(Year, Zero), Item::Literal("-"), @@ -320,6 +328,7 @@ impl DateTime where Tz::Offset: fmt::Display { Micros => Some(Item::Fixed(Fixed::Nanosecond6)), Nanos => Some(Item::Fixed(Fixed::Nanosecond9)), AutoSi => Some(Item::Fixed(Fixed::Nanosecond)), + __NonExhaustive => unreachable!(), }; let tzitem = Item::Fixed( @@ -1177,6 +1186,14 @@ mod tests { assert_eq!(ut.to_rfc3339_opts(AutoSi, true), "2018-01-11T02:05:13.084660Z"); } + #[test] + #[should_panic] + fn test_rfc3339_opts_nonexhaustive() { + use SecondsFormat; + let dt = Utc.ymd(1999, 10, 9).and_hms(1, 2, 3); + dt.to_rfc3339_opts(SecondsFormat::__NonExhaustive, true); + } + #[test] fn test_datetime_from_str() { assert_eq!("2015-2-18T23:16:9.15Z".parse::>(),