Определить количество часов в данный день (плюс или минус часы смены летнего времени) - PullRequest
3 голосов
/ 24 февраля 2012

Учитывая NSDate и NSCalendar, как мне определить количество часов в дне, следующем за данной датой.Это может быть 23, 24 или 25, в зависимости от того, входит ли на следующий день переход на летнее время (23), обычный (24) или выход на летнее время (25).

Ответы [ 2 ]

3 голосов
/ 25 февраля 2012

Вы можете спросить у календаря, сколько времени занимает любая единица (и когда эта единица запускается) с помощью rangeOfUnit:startDate:interval:forDate:.

// Test date (the day DST begins)
NSDateComponents *components = [[NSDateComponents alloc] init];
components.year = 2012;
components.month = 3;
components.day = 11;   

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:components];
NSTimeInterval dayLength;
[calendar rangeOfUnit:NSDayCalendarUnit startDate:NULL interval:&dayLength forDate:date];
NSLog(@"%f seconds", dayLength);

Обратите внимание, что rangeOfUnit:... может технически завершиться с ошибкой и вернуть NO, но если вы управляете входами, этого не должно быть.

2 голосов
/ 24 февраля 2012
// Test input
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy MM dd HH:mm:ss";
NSDate *referenceDate = [formatter dateFromString:@"2012 03 24 13:14:14"];

// Get reference date with day precision
NSCalendar *calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
NSDateComponents *components = [calendar components:unitFlags fromDate:referenceDate];

NSDate *today = [calendar dateFromComponents:components];

// Set components to add 1 day
components = [[NSDateComponents alloc] init];
components.day = 1;

// The day after the reference date
NSDate *tomorrow = [calendar dateByAddingComponents:components toDate:today options:0];

// The day after that
NSDate *afterTomorrow = [calendar dateByAddingComponents:components toDate:tomorrow options:0];

// Difference in hours: 23, 24 or 25
NSUInteger hours = [afterTomorrow timeIntervalSinceDate:tomorrow] / 3600;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...