2013-07-13 2 views
0

Да, это похоже на 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 ; 
} 
+0

возможно дубликат [NSDate начале дня и в конце дня] (Http: // stackoverflow.com/questions/13324633/nsdate-beginning-of-day-and-end-of-day) – hd1

+0

Что значит «день, представленный временным интервалом»? ['NSTimeInterval' не представляют дни] (http://stackoverflow.com/questions/7971807/nstimeinterval-to-nsdate/7972086#7972086), они представляют _intervals_. У вас должна быть начальная точка, чтобы интервал дал вам конечную точку. Какова ваша начальная точка, и почему бы вам не начать с «NSDate»? –

+0

Напишите единичный тест для вашего метода с диапазонами дат, охватывающих жизненный цикл солнечной системы, который в настоящее время составляет +/- 4,5e9 лет? –

ответ

2

Это не будет обрабатывать кромки. В Бразилии DST либо устраняет, либо дублирует полуночи-один-AM час. Итак, в некоторые дни, есть нет полночь, а на других есть два midnights.

Правильный способ справиться с этим - либо создать свой собственный тип данных, представляющий время суток (независимо от даты), либо использовать NSDateComponents, устанавливая только компоненты времени суток.

Если вы хотите представить дату, независимо от времени суток, вам лучше использовать полдень того дня, чем использовать полночь. Или вы можете создать свой собственный тип данных или использовать NSDateComponents, сохраняя только день/месяц/год/эра.

Я высоко рекомендуем вам смотреть эти видео WWDC ASAP: