In my personal opinion, it is simpler than nsdatecomponents. After a simple test, there is no problem. If you have any questions about the test, please provide your feedback.
Nsdate * olddate = [nsdate date];
Nstimeinterval interval = olddate. timeintervalsince1970;
// Divide interval minus interval by the remainder of the number of seconds in a day.
// Nstimeinterval is actually of the double type, and % can only be used in the int type, so the fmod function is required.
Nsdate * newdate = [nsdate datewithtimeintervalsince1970: interval-fmod (interval, 60*60*24)];
Using nsdatecomponents:
Unsigned int flags = nsyearcalendarunit | nsmonthcalendarunit | nsdaycalendarunit;
Nscalendar * Calendar = [nscalendar currentcalendar];
Nsdatecomponents * components = [calendar components: Flags fromdate: date];
Nsdate * dateonly = [calendar datefromcomponents: components];
The date is only accurate to the time part of the day that is omitted from the time.