pub mod builder;
#[cfg(feature = "chrono")]
use chrono::{DateTime, Datelike, LocalResult, TimeZone, Timelike, Utc};
use self::builder::ZipDateTimeBuilder;
#[derive(Debug, Default, PartialEq, Eq, Clone, Copy, Hash)]
pub struct ZipDateTime {
pub(crate) date: u16,
pub(crate) time: u16,
}
impl ZipDateTime {
pub fn year(&self) -> i32 {
(((self.date & 0xFE00) >> 9) + 1980).into()
}
pub fn month(&self) -> u32 {
((self.date & 0x1E0) >> 5).into()
}
pub fn day(&self) -> u32 {
(self.date & 0x1F).into()
}
pub fn hour(&self) -> u32 {
((self.time & 0xF800) >> 11).into()
}
pub fn minute(&self) -> u32 {
((self.time & 0x7E0) >> 5).into()
}
pub fn second(&self) -> u32 {
((self.time & 0x1F) << 1).into()
}
#[cfg(feature = "chrono")]
pub fn as_chrono(&self) -> LocalResult<DateTime<Utc>> {
self.into()
}
#[cfg(feature = "chrono")]
pub fn from_chrono(dt: &DateTime<Utc>) -> Self {
dt.into()
}
}
impl From<ZipDateTimeBuilder> for ZipDateTime {
fn from(builder: ZipDateTimeBuilder) -> Self {
builder.0
}
}
#[cfg(feature = "chrono")]
impl From<&DateTime<Utc>> for ZipDateTime {
fn from(value: &DateTime<Utc>) -> Self {
let mut builder = ZipDateTimeBuilder::new();
builder = builder.year(value.date_naive().year());
builder = builder.month(value.date_naive().month());
builder = builder.day(value.date_naive().day());
builder = builder.hour(value.time().hour());
builder = builder.minute(value.time().minute());
builder = builder.second(value.time().second());
builder.build()
}
}
#[cfg(feature = "chrono")]
impl From<&ZipDateTime> for LocalResult<DateTime<Utc>> {
fn from(value: &ZipDateTime) -> Self {
Utc.with_ymd_and_hms(value.year(), value.month(), value.day(), value.hour(), value.minute(), value.second())
}
}
#[cfg(feature = "chrono")]
impl From<DateTime<Utc>> for ZipDateTime {
fn from(value: DateTime<Utc>) -> Self {
(&value).into()
}
}
#[cfg(feature = "chrono")]
impl From<ZipDateTime> for LocalResult<DateTime<Utc>> {
fn from(value: ZipDateTime) -> Self {
(&value).into()
}
}