Да, это похоже на NSDate beginning of day and end of day, но эта тема не обсуждает, работает ли она для всех ситуаций, о которых я прошу здесь. Этот вопрос касался не возврата правильного значения, потому что они забыли NSDayCalendarUnit. Этот вопрос касается точности значения, которое, как оказалось, не будет работать с DST, как я подозревал.Этот метод всегда дает мне 12:00:00 текущего дня в ios?
В нескольких частях моего приложения у меня есть необходимость указать время суток, не заботясь о фактическом дне, например, выполнять эту деятельность в 16:00 каждый день. Я видел несколько сообщений, которые рассказывают о том, как это сделать, но хотели бы получить отзывы о моем подходе. Метод, приведенный ниже, предназначен для возврата в полночь любого конкретного дня и будет использоваться в сочетании со смещением, которое представляет количество секунд до определенного времени (например, 1:00:00 am как 3600).
Я считаю, что это должно сработать, но любопытно, если он будет обрабатывать граничные случаи, например, летнее время. Любая обратная связь будет оценена. Благодаря!
// We want to return 12:00:00AM of the day represented by the time interval
NSTimeInterval getStartOfDay(NSTimeInterval t)
{
// first convert the time interval to an NSDate
NSDate *ourStartingDate = [NSDate dateWithTimeIntervalSinceReferenceDate:t] ;
// get just the year, month, and day of our date
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components:unitFlags fromDate:ourStartingDate];
NSDate *ourConvertedDate = [gregorian dateFromComponents:comps] ;
// put that date into a time interval
NSTimeInterval convertedInterval = [ourConvertedDate timeIntervalSinceReferenceDate] ;
// because the time interval is in GMT and we may not be, we need to get an offset
NSInteger timeZoneOffset = [[NSTimeZone localTimeZone ] secondsFromGMT] ;
// account for the time zone difference
convertedInterval = convertedInterval - timeZoneOffset ;
// still might have a Daylight Savings Time issue?
return convertedInterval ;
}
возможно дубликат [NSDate начале дня и в конце дня] (Http: // stackoverflow.com/questions/13324633/nsdate-beginning-of-day-and-end-of-day) – hd1
Что значит «день, представленный временным интервалом»? ['NSTimeInterval' не представляют дни] (http://stackoverflow.com/questions/7971807/nstimeinterval-to-nsdate/7972086#7972086), они представляют _intervals_. У вас должна быть начальная точка, чтобы интервал дал вам конечную точку. Какова ваша начальная точка, и почему бы вам не начать с «NSDate»? –
Напишите единичный тест для вашего метода с диапазонами дат, охватывающих жизненный цикл солнечной системы, который в настоящее время составляет +/- 4,5e9 лет? –