diff --git a/src/darwin/Framework/CHIP/MTRConversion.mm b/src/darwin/Framework/CHIP/MTRConversion.mm index 491a585c00585d..c6ba6ec52fbf32 100644 --- a/src/darwin/Framework/CHIP/MTRConversion.mm +++ b/src/darwin/Framework/CHIP/MTRConversion.mm @@ -63,18 +63,18 @@ CHIP_ERROR SetToCATValues(NSSet * catSet, chip::CATValues & values) bool DateToMatterEpochSeconds(NSDate * date, uint32_t & matterEpochSeconds) { - NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; - NSDateComponents * components = [calendar componentsInTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0] fromDate:date]; + auto timeSinceUnixEpoch = date.timeIntervalSince1970; + if (timeSinceUnixEpoch < static_cast(chip::kChipEpochSecondsSinceUnixEpoch)) { + // This is a pre-Matter-epoch time, and cannot be represented in epoch-s. + return false; + } - if (!chip::CanCastTo(components.year)) { + auto timeSinceMatterEpoch = timeSinceUnixEpoch - chip::kChipEpochSecondsSinceUnixEpoch; + if (timeSinceMatterEpoch > UINT32_MAX) { + // Too far into the future. return false; } - uint16_t year = static_cast([components year]); - uint8_t month = static_cast([components month]); - uint8_t day = static_cast([components day]); - uint8_t hour = static_cast([components hour]); - uint8_t minute = static_cast([components minute]); - uint8_t second = static_cast([components second]); - return chip::CalendarToChipEpochTime(year, month, day, hour, minute, second, matterEpochSeconds); + matterEpochSeconds = static_cast(timeSinceMatterEpoch); + return true; }