diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1f48ba12..8a799138 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -209,4 +209,8 @@
 ### Fixed
 
  - Fixes build errors that occur when all default features are disabled.
- - Fixes more cases of a bug when ZIP64 magic bytes occur in filenames.
\ No newline at end of file
+ - Fixes more cases of a bug when ZIP64 magic bytes occur in filenames.
+
+## [0.10.1]
+
+ - Date and time conversion methods now return `DateTimeRangeError` rather than `()` on error.
\ No newline at end of file
diff --git a/src/types.rs b/src/types.rs
index 8af87d0b..b3ec71d7 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -53,6 +53,7 @@ mod atomic {
 
 #[cfg(feature = "time")]
 use time::{error::ComponentRange, Date, Month, OffsetDateTime, PrimitiveDateTime, Time};
+use crate::result::DateTimeRangeError;
 
 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
 pub enum System {
@@ -115,33 +116,31 @@ impl arbitrary::Arbitrary<'_> for DateTime {
 }
 
 #[cfg(feature = "chrono")]
-#[allow(clippy::result_unit_err)]
 impl TryFrom<NaiveDateTime> for DateTime {
-    type Error = ();
+    type Error = DateTimeRangeError;
 
     fn try_from(value: NaiveDateTime) -> Result<Self, Self::Error> {
         DateTime::from_date_and_time(
-            value.year().try_into().map_err(|_| ())?,
-            value.month().try_into().map_err(|_| ())?,
-            value.day().try_into().map_err(|_| ())?,
-            value.hour().try_into().map_err(|_| ())?,
-            value.minute().try_into().map_err(|_| ())?,
-            value.second().try_into().map_err(|_| ())?,
+            value.year().try_into()?,
+            value.month().try_into()?,
+            value.day().try_into()?,
+            value.hour().try_into()?,
+            value.minute().try_into()?,
+            value.second().try_into()?,
         )
     }
 }
 
 #[cfg(feature = "chrono")]
-#[allow(clippy::result_unit_err)]
 impl TryInto<NaiveDateTime> for DateTime {
-    type Error = ();
+    type Error = DateTimeRangeError;
 
     fn try_into(self) -> Result<NaiveDateTime, Self::Error> {
         let date = NaiveDate::from_ymd_opt(self.year.into(), self.month.into(), self.day.into())
-            .ok_or(())?;
+            .ok_or(DateTimeRangeError)?;
         let time =
             NaiveTime::from_hms_opt(self.hour.into(), self.minute.into(), self.second.into())
-                .ok_or(())?;
+                .ok_or(DateTimeRangeError)?;
         Ok(NaiveDateTime::new(date, time))
     }
 }
@@ -189,7 +188,6 @@ impl DateTime {
     /// * hour: [0, 23]
     /// * minute: [0, 59]
     /// * second: [0, 60]
-    #[allow(clippy::result_unit_err)]
     pub fn from_date_and_time(
         year: u16,
         month: u8,
@@ -197,7 +195,7 @@ impl DateTime {
         hour: u8,
         minute: u8,
         second: u8,
-    ) -> Result<DateTime, ()> {
+    ) -> Result<DateTime, DateTimeRangeError> {
         if (1980..=2107).contains(&year)
             && (1..=12).contains(&month)
             && (1..=31).contains(&day)
@@ -214,7 +212,7 @@ impl DateTime {
                 second,
             })
         } else {
-            Err(())
+            Err(DateTimeRangeError)
         }
     }
 
@@ -235,10 +233,9 @@ impl DateTime {
     /// Converts a OffsetDateTime object to a DateTime
     ///
     /// Returns `Err` when this object is out of bounds
-    #[allow(clippy::result_unit_err)]
     #[deprecated(note = "use `DateTime::try_from()`")]
-    pub fn from_time(dt: OffsetDateTime) -> Result<DateTime, ()> {
-        dt.try_into().map_err(|_err| ())
+    pub fn from_time(dt: OffsetDateTime) -> Result<DateTime, DateTimeRangeError> {
+        dt.try_into().map_err(|_err| DateTimeRangeError)
     }
 
     /// Gets the time portion of this datetime in the msdos representation
@@ -312,22 +309,21 @@ impl DateTime {
 }
 
 #[cfg(feature = "time")]
-#[allow(clippy::result_unit_err)]
 impl TryFrom<OffsetDateTime> for DateTime {
-    type Error = ();
+    type Error = DateTimeRangeError;
 
     fn try_from(dt: OffsetDateTime) -> Result<Self, Self::Error> {
         if dt.year() >= 1980 && dt.year() <= 2107 {
             Ok(DateTime {
-                year: (dt.year()) as u16,
-                month: (dt.month()) as u8,
+                year: (dt.year()).try_into()?,
+                month: (dt.month()).try_into()?,
                 day: dt.day(),
                 hour: dt.hour(),
                 minute: dt.minute(),
                 second: dt.second(),
             })
         } else {
-            Err(())
+            Err(DateTimeRangeError)
         }
     }
 }