Как вы вычисляете день года на определенную дату в Objective-C?
Это то, что я обнаружил, что трачу часы, чтобы понять, и поэтому хочу поделиться с вами.
Вопрос: как определить день года на конкретную дату?
например, 15 января – 15-й день, а 31 декабря – 365-й день, когда это не високосный год.
- Как анализировать длительность ISO-8601 в Objective C?
- Данные о сердечном ритме на яблоне
- Как предоставить пространство между двумя ячейками в виде таблицы?
- NSDateFormatter и yyyy-MM-dd
- Как использовать NSTimer?
- Добавить UIView над всеми другими видами, включая StatusBar
- Возвратитесь к поведению приложения после разговора по телефону в собственном коде, чем UIWebView
- Обнаружение iPhone / iPod Touch
Попробуй это:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSUInteger dayOfYear = [gregorian ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:[NSDate date]]; [gregorian release]; return dayOfYear;
где date
– это дата, в которую вы хотите определить день года. Документация по методу NSCalendar.ordinalityOfUnit приведена здесь .
Поэтому решение, которое я придумал, довольно аккуратно и просто и не сложно.
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"D"]; NSUInteger dayOfYear = [[formatter stringFromDate:[NSDate date]] intValue]; [formatter release]; return dayOfYear;
Трюк, который я потратил так долго, чтобы понять, это использовать NSDateFormatter. «D» – это флаг для дня года.
Надеюсь, что это было полезно для вас, у кого такая же проблема, как у меня.
Используя ARC и заменяя устаревшие символы, ответ Джона Фэминеллы будет выглядеть так:
NSCalendar *greg = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; NSUInteger dayOfYear= [greg ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[NSDate date]];
С classом NSDate . Использовать время сообщенияIntervalSinceDate. Он вернет вам значение NSTimeInterval (фактически это двойное число), которое представляет секунды, прошедшие с момента, когда вы захотите. После этого легко конвертировать секунды в день.
Если вы усекаете seconds/86400
, вы получите несколько дней.
Предположим, вы хотите дней с 1 января 2010 года.
// current date/time NSDate *now = [[NSData alloc] init]; // seconds elapsed since January 1st 2010 00:00:00 (GMT -4) until now NSInteval interval = [now timeIntervalSinceDate: [NSDate dateWithString:@"2010-01-01 00:00:00 -0400"]]; // days since January 1st 2010 00:00:00 (GMT -4) until now int days = (int)interval/86400;