Add doctests for negative timestamps

This commit is contained in:
Brandon W Maister 2018-06-13 09:10:31 -04:00
parent 0ef8c5cc83
commit a58a833324
3 changed files with 24 additions and 5 deletions

View File

@ -871,7 +871,16 @@ pub trait Datelike: Sized {
/// Returns `None` when the resulting value would be invalid. /// Returns `None` when the resulting value would be invalid.
fn with_ordinal0(&self, ordinal0: u32) -> Option<Self>; fn with_ordinal0(&self, ordinal0: u32) -> Option<Self>;
/// Returns the number of days since January 1, 1 (Day 1) in the proleptic Gregorian calendar. /// Returns the number of days since January 1, Year 1 (aka Day 1) in the
/// proleptic Gregorian calendar.
///
/// # Example:
///
/// ~~~
/// use chrono::{NaiveDate, Datelike};
/// assert_eq!(NaiveDate::from_ymd(1970, 1, 1).num_days_from_ce(), 719163);
/// assert_eq!(NaiveDate::from_ymd(0, 1, 1).num_days_from_ce(), -365);
/// ~~~
fn num_days_from_ce(&self) -> i32 { fn num_days_from_ce(&self) -> i32 {
// we know this wouldn't overflow since year is limited to 1/2^13 of i32's full range. // we know this wouldn't overflow since year is limited to 1/2^13 of i32's full range.
let mut year = self.year() - 1; let mut year = self.year() - 1;

View File

@ -255,12 +255,19 @@ impl NaiveDateTime {
/// ///
/// let dt = NaiveDate::from_ymd(2001, 9, 9).and_hms(1, 46, 40); /// let dt = NaiveDate::from_ymd(2001, 9, 9).and_hms(1, 46, 40);
/// assert_eq!(dt.timestamp(), 1_000_000_000); /// assert_eq!(dt.timestamp(), 1_000_000_000);
///
/// let dt = NaiveDate::from_ymd(1969, 12, 31).and_hms(23, 59, 59);
/// assert_eq!(dt.timestamp(), -1);
///
/// let dt = NaiveDate::from_ymd(-1, 1, 1).and_hms(0, 0, 0);
/// assert_eq!(dt.timestamp(), -62198755200);
/// ~~~~ /// ~~~~
#[inline] #[inline]
pub fn timestamp(&self) -> i64 { pub fn timestamp(&self) -> i64 {
let ndays = i64::from(self.date.num_days_from_ce()); const UNIX_EPOCH_DAY: i64 = 719_163;
let nseconds = i64::from(self.time.num_seconds_from_midnight()); let gregorian_day = i64::from(self.date.num_days_from_ce());
(ndays - 719_163) * 86_400 + nseconds let seconds_from_midnight = i64::from(self.time.num_seconds_from_midnight());
(gregorian_day - UNIX_EPOCH_DAY) * 86_400 + seconds_from_midnight
} }
/// Returns the number of non-leap *milliseconds* since midnight on January 1, 1970. /// Returns the number of non-leap *milliseconds* since midnight on January 1, 1970.
@ -283,6 +290,9 @@ impl NaiveDateTime {
/// ///
/// let dt = NaiveDate::from_ymd(2001, 9, 9).and_hms_milli(1, 46, 40, 555); /// let dt = NaiveDate::from_ymd(2001, 9, 9).and_hms_milli(1, 46, 40, 555);
/// assert_eq!(dt.timestamp_millis(), 1_000_000_000_555); /// assert_eq!(dt.timestamp_millis(), 1_000_000_000_555);
///
/// let dt = NaiveDate::from_ymd(1969, 12, 31).and_hms_milli(23, 59, 59, 100);
/// assert_eq!(dt.timestamp_millis(), -900);
/// ~~~~ /// ~~~~
#[inline] #[inline]
pub fn timestamp_millis(&self) -> i64 { pub fn timestamp_millis(&self) -> i64 {

View File

@ -475,7 +475,7 @@ mod tests {
use Weekday; use Weekday;
use super::{Of, Mdf}; use super::{Of, Mdf};
use super::{YearFlags, A, B, C, D, E, F, G, AG, BA, CB, DC, ED, FE, GF}; use super::{YearFlags, A, B, C, D, E, F, G, AG, BA, CB, DC, ED, FE, GF};
use num_iter::range_inclusive; use self::num_iter::range_inclusive;
use std::u32; use std::u32;
const NONLEAP_FLAGS: [YearFlags; 7] = [A, B, C, D, E, F, G]; const NONLEAP_FLAGS: [YearFlags; 7] = [A, B, C, D, E, F, G];