Add tests for negative timestamps / DateTime before Unix Epoch
This commit is contained in:
parent
b3ea308997
commit
e2910695d2
@ -74,7 +74,7 @@ impl DateTime {
|
|||||||
let mut month = Some(Month::December);
|
let mut month = Some(Month::December);
|
||||||
while month.is_some() {
|
while month.is_some() {
|
||||||
let m = month.unwrap();
|
let m = month.unwrap();
|
||||||
if seconds < -m.seconds(year) {
|
if -seconds < m.seconds(year) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
seconds += m.seconds(year);
|
seconds += m.seconds(year);
|
||||||
@ -87,16 +87,17 @@ impl DateTime {
|
|||||||
day -= 1;
|
day -= 1;
|
||||||
}
|
}
|
||||||
let mut hour: i8 = 23;
|
let mut hour: i8 = 23;
|
||||||
while hour >= 0 && seconds < -SECONDS_PER_HOUR {
|
while hour > 0 && seconds < -SECONDS_PER_HOUR {
|
||||||
seconds += SECONDS_PER_HOUR;
|
seconds += SECONDS_PER_HOUR;
|
||||||
hour -= 1;
|
hour -= 1;
|
||||||
}
|
}
|
||||||
let hour = hour.try_into().unwrap();
|
let hour = hour.try_into().unwrap();
|
||||||
let mut minute: i8 = 60;
|
let mut minute: i8 = 60;
|
||||||
while minute >= 0 && seconds < -60 {
|
while minute > 0 && seconds < -60 {
|
||||||
seconds += 60;
|
seconds += 60;
|
||||||
minute -= 1;
|
minute -= 1;
|
||||||
}
|
}
|
||||||
|
minute -= 1;
|
||||||
let minute = minute.try_into().unwrap();
|
let minute = minute.try_into().unwrap();
|
||||||
let second: u8 = (seconds + 60).try_into().unwrap();
|
let second: u8 = (seconds + 60).try_into().unwrap();
|
||||||
Self {
|
Self {
|
||||||
@ -150,8 +151,9 @@ impl DateTime {
|
|||||||
|
|
||||||
pub fn weekday(&self) -> Weekday {
|
pub fn weekday(&self) -> Weekday {
|
||||||
let ts = self.timestamp_naive();
|
let ts = self.timestamp_naive();
|
||||||
let days = ts / SECONDS_PER_DAY;
|
let mut days = ts / SECONDS_PER_DAY;
|
||||||
let rem = days % 7;
|
if ts < 0 { days -= 1 }
|
||||||
|
let rem = days.rem_euclid(7);
|
||||||
rem.try_into().unwrap()
|
rem.try_into().unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,6 +232,28 @@ mod tests {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
assert_eq!(dt.weekday(), Weekday::Saturday);
|
assert_eq!(dt.weekday(), Weekday::Saturday);
|
||||||
|
dt = DateTime {
|
||||||
|
year: Year::new(1965),
|
||||||
|
month: Month::February,
|
||||||
|
day: 9,
|
||||||
|
hour: 4,
|
||||||
|
minute: 4,
|
||||||
|
second: 37,
|
||||||
|
zone: TimeZone::Utc,
|
||||||
|
};
|
||||||
|
assert_eq!(dt.weekday(), Weekday::Tuesday);
|
||||||
|
dt.day -= 1;
|
||||||
|
assert_eq!(dt.weekday(), Weekday::Monday);
|
||||||
|
dt.day -= 1;
|
||||||
|
assert_eq!(dt.weekday(), Weekday::Sunday);
|
||||||
|
dt.day -= 1;
|
||||||
|
assert_eq!(dt.weekday(), Weekday::Saturday);
|
||||||
|
dt.day -= 1;
|
||||||
|
assert_eq!(dt.weekday(), Weekday::Friday);
|
||||||
|
dt.day -= 1;
|
||||||
|
assert_eq!(dt.weekday(), Weekday::Thursday);
|
||||||
|
dt.day -= 1;
|
||||||
|
assert_eq!(dt.weekday(), Weekday::Wednesday);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -271,6 +295,22 @@ mod tests {
|
|||||||
assert_eq!(dt, DateTime::from_timestamp(ts));
|
assert_eq!(dt, DateTime::from_timestamp(ts));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ts_negative() {
|
||||||
|
let ts: i64 = -154382123;
|
||||||
|
let dt = DateTime {
|
||||||
|
year: Year::new(1965),
|
||||||
|
month: Month::February,
|
||||||
|
day: 9,
|
||||||
|
hour: 4,
|
||||||
|
minute: 4,
|
||||||
|
second: 37,
|
||||||
|
zone: TimeZone::Utc,
|
||||||
|
};
|
||||||
|
assert_eq!(dt.timestamp(), ts);
|
||||||
|
assert_eq!(dt, DateTime::from_timestamp(ts));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn fmt() {
|
fn fmt() {
|
||||||
let mut dt = DateTime::from_timestamp(1706571482);
|
let mut dt = DateTime::from_timestamp(1706571482);
|
||||||
|
Loading…
Reference in New Issue
Block a user