Fix end of month handling #59
197
ifc/src/lib.rs
197
ifc/src/lib.rs
|
@ -250,8 +250,12 @@ impl From<chrono::NaiveDate> for IFC {
|
|||
{
|
||||
days = days - 1;
|
||||
}
|
||||
let month: u8 = (days / 28).try_into().unwrap();
|
||||
let day: u8 = (days % 28).try_into().unwrap();
|
||||
let mut month: u8 = (days / 28).try_into().unwrap();
|
||||
let mut day: u8 = (days % 28).try_into().unwrap();
|
||||
if day == 0 {
|
||||
month = month - 1;
|
||||
day = 28;
|
||||
}
|
||||
Self::Day(Day {
|
||||
year: date.year(),
|
||||
month: month + 1,
|
||||
|
@ -268,167 +272,6 @@ impl From<IFC> for chrono::NaiveDate {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
impl IFC {
|
||||
pub fn year_day(year: u32) -> Self {
|
||||
Self {
|
||||
year,
|
||||
ordinal: if is_leap_year(year) { 366 } else { 365 }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
impl From<chrono::Date<chrono::Utc>> for IFC {
|
||||
fn from(d: chrono::Date<chrono::Utc>) -> IFC {
|
||||
IFC::from(d.naive_utc())
|
||||
}
|
||||
}
|
||||
|
||||
impl From<chrono::Date<chrono_tz::Tz>> for IFC {
|
||||
fn from(d: chrono::Date<chrono_tz::Tz>) -> IFC {
|
||||
IFC::from(d.naive_utc())
|
||||
}
|
||||
}
|
||||
|
||||
impl From<chrono::NaiveDate> for IFC {
|
||||
fn from(d: NaiveDate) -> IFC {
|
||||
//println!("d: {} [{}]", d.format("%Y-%m-%d"), d.ordinal());
|
||||
IFC {
|
||||
year: (d.year() + 10000) as u32,
|
||||
ordinal: d.ordinal0(),
|
||||
leap_year: is_leap_year(d.year()),
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
impl Datelike for IFC {
|
||||
fn year(&self) -> i32 {
|
||||
// self.year as i32
|
||||
unimplemented!()
|
||||
}
|
||||
fn month(&self) -> u32 {
|
||||
// self.month0() + 1
|
||||
unimplemented!()
|
||||
}
|
||||
fn month0(&self) -> u32 {
|
||||
/*
|
||||
if self.leap_year && self.ordinal == 365 {
|
||||
12
|
||||
} else if self.leap_year && self.ordinal == 168 {
|
||||
5
|
||||
} else {
|
||||
self.ordinal / 28
|
||||
}
|
||||
*/
|
||||
unimplemented!()
|
||||
}
|
||||
fn day(&self) -> u32 {
|
||||
// self.day0() + 1
|
||||
unimplemented!()
|
||||
}
|
||||
fn day0(&self) -> u32 {
|
||||
/*
|
||||
if self.leap_year {
|
||||
if self.ordinal == 365 {
|
||||
28
|
||||
} else if self.ordinal == 168 {
|
||||
28
|
||||
} else if self.ordinal > 168 {
|
||||
(self.ordinal - 1).rem_euclid(28) as u32
|
||||
} else {
|
||||
self.ordinal.rem_euclid(28) as u32
|
||||
}
|
||||
} else {
|
||||
if self.ordinal == 364 {
|
||||
28
|
||||
} else {
|
||||
self.ordinal.rem_euclid(28) as u32
|
||||
}
|
||||
}
|
||||
*/
|
||||
unimplemented!()
|
||||
}
|
||||
fn ordinal(&self) -> u32 {
|
||||
// self.ordinal + 1
|
||||
unimplemented!()
|
||||
}
|
||||
fn ordinal0(&self) -> u32 {
|
||||
// self.ordinal
|
||||
unimplemented!()
|
||||
}
|
||||
fn weekday(&self) -> chrono::Weekday {
|
||||
if self.day0() == 28 {
|
||||
chrono::Weekday::Sat
|
||||
} else {
|
||||
match self.day0().rem_euclid(7) {
|
||||
0 => chrono::Weekday::Sun,
|
||||
1 => chrono::Weekday::Mon,
|
||||
2 => chrono::Weekday::Tue,
|
||||
3 => chrono::Weekday::Wed,
|
||||
4 => chrono::Weekday::Thu,
|
||||
5 => chrono::Weekday::Fri,
|
||||
6 => chrono::Weekday::Sat,
|
||||
_ => panic!("rem_euclid should not return anything outside the 0..6 range"),
|
||||
}
|
||||
}
|
||||
}
|
||||
fn iso_week(&self) -> chrono::IsoWeek {
|
||||
panic!("iso_week is not implemented because chrono does not expose any constructors for IsoWeek!");
|
||||
}
|
||||
fn with_year(&self, year: i32) -> Option<IFC> {
|
||||
/*
|
||||
Some(IFC {
|
||||
year: (year as u32) + 10000,
|
||||
ordinal: self.ordinal,
|
||||
leap_year: is_leap_year(year),
|
||||
})
|
||||
*/
|
||||
unimplemented!()
|
||||
}
|
||||
fn with_month(&self, month: u32) -> Option<IFC> {
|
||||
// Some(IFC::ymd(self.year, month as u8, self.day() as u8))
|
||||
unimplemented!()
|
||||
}
|
||||
fn with_month0(&self, month: u32) -> Option<IFC> {
|
||||
// Some(IFC::ymd(self.year, month as u8 + 1, self.day() as u8))
|
||||
unimplemented!()
|
||||
}
|
||||
fn with_day(&self, day: u32) -> Option<IFC> {
|
||||
// Some(IFC::ymd(self.year, self.month() as u8, day as u8))
|
||||
unimplemented!()
|
||||
}
|
||||
fn with_day0(&self, day: u32) -> Option<IFC> {
|
||||
// Some(IFC::ymd(self.year, self.month() as u8, day as u8 + 1))
|
||||
unimplemented!()
|
||||
}
|
||||
fn with_ordinal(&self, ordinal: u32) -> Option<IFC> {
|
||||
/*
|
||||
Some(IFC {
|
||||
year: self.year,
|
||||
ordinal,
|
||||
leap_year: self.leap_year,
|
||||
})
|
||||
*/
|
||||
unimplemented!()
|
||||
}
|
||||
fn with_ordinal0(&self, ordinal: u32) -> Option<IFC> {
|
||||
/*
|
||||
Some(IFC {
|
||||
year: self.year,
|
||||
ordinal: ordinal + 1,
|
||||
leap_year: self.leap_year,
|
||||
})
|
||||
*/
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
@ -612,10 +455,34 @@ mod tests {
|
|||
IFC::from(NaiveDate::from_ymd_opt(12022, 1, 1).unwrap()),
|
||||
IFC::ymd(12022, 1, 1).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
IFC::from(NaiveDate::from_ymd_opt(12022, 1, 2).unwrap()),
|
||||
IFC::ymd(12022, 1, 2).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
IFC::from(NaiveDate::from_ymd_opt(12022, 1, 3).unwrap()),
|
||||
IFC::ymd(12022, 1, 3).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
IFC::from(chrono::NaiveDate::from_ymd_opt(2023, 01, 26).unwrap()),
|
||||
IFC::ymd(2023, 1, 26).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
IFC::from(chrono::NaiveDate::from_ymd_opt(2023, 01, 27).unwrap()),
|
||||
IFC::ymd(2023, 1, 27).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
IFC::from(chrono::NaiveDate::from_ymd_opt(2023, 01, 28).unwrap()),
|
||||
IFC::ymd(2023, 1, 28).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
IFC::from(NaiveDate::from_ymd_opt(12022, 1, 29).unwrap()),
|
||||
IFC::ymd(12022, 2, 1).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
IFC::from(NaiveDate::from_ymd_opt(12022, 1, 30).unwrap()),
|
||||
IFC::ymd(12022, 2, 2).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
IFC::from(NaiveDate::from_ymd_opt(12022, 2, 26).unwrap()),
|
||||
IFC::ymd(12022, 3, 1).unwrap()
|
||||
|
@ -644,6 +511,10 @@ mod tests {
|
|||
IFC::from(NaiveDate::from_ymd_opt(12022, 8, 13).unwrap()),
|
||||
IFC::ymd(12022, 9, 1).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
IFC::from(chrono::NaiveDate::from_ymd_opt(2023, 08, 12).unwrap()),
|
||||
IFC::ymd(2023, 8, 28).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
IFC::from(NaiveDate::from_ymd_opt(12022, 9, 10).unwrap()),
|
||||
IFC::ymd(12022, 10, 1).unwrap()
|
||||
|
|
Loading…
Reference in New Issue