我在这里错过了什么吗?似乎 Apple 提供的方法仅适用于 UTC,无论机器的默认时区如何,或者您将其设置为什么。
这是我得到的输出:
Output:
2013-02-01 10:41:24.152 Scratch[17640:c07] cal=gregorian, cal.timeZone=America/Los_Angeles (PST) offset -28800
2013-02-01 10:41:24.154 Scratch[17640:c07] date_Feb1_1400PST=2013-02-01 14:00 -0800
2013-02-01 10:41:24.156 Scratch[17640:c07] date_Feb2_1200PST=2013-02-02 12:00 -0800
2013-02-01 10:41:24.157 Scratch[17640:c07] midnights between=1
2013-02-01 10:41:24.158 Scratch[17640:c07] and then...
2013-02-01 10:41:24.159 Scratch[17640:c07] date_Feb1_2000PST=2013-02-01 22:00 -0800
2013-02-01 10:41:24.161 Scratch[17640:c07] date_Feb2_1000PST=2013-02-02 10:00 -0800
2013-02-01 10:41:24.161 Scratch[17640:c07] midnights between=0
我真正想知道的是给定时区(本地或其他地方,不一定是UTC)的两天之间的“多少个午夜”(即多少个日历日差异)
这似乎是一个如此常见且相当简单的问题,以至于我惊讶地发现它是多么混乱和难以弄清楚。
我不是在寻找涉及“mod 86400”或类似脏东西的答案。框架应该能够认真地告诉我这一点。
- (void)doDateComparisonStuff {
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
cal.timeZone = [NSTimeZone timeZoneWithName:@"America/Los_Angeles"];
NSLog(@"cal=%@, cal.timeZone=%@", cal.calendarIdentifier, cal.timeZone);
NSDate *date_Feb1_1400PST = [self dateFromStr:@"20130201 1400"];
NSLog(@"date_Feb1_1400PST=%@", [self stringFromDate:date_Feb1_1400PST]);
NSDate *date_Feb2_1200PST = [self dateFromStr:@"20130202 1200"];
NSLog(@"date_Feb2_1200PST=%@", [self stringFromDate:date_Feb2_1200PST]);
NSLog(@"midnights between=%d", [self daysWithinEraFromDate:date_Feb1_1400PST toDate:date_Feb2_1200PST usingCalendar:cal]);
NSLog(@"and then...");
NSDate *date_Feb1_2000PST = [self dateFromStr:@"20130201 2200"];
NSLog(@"date_Feb1_2000PST=%@", [self stringFromDate:date_Feb1_2000PST]);
NSDate *date_Feb2_1000PST = [self dateFromStr:@"20130202 1000"];
NSLog(@"date_Feb2_1000PST=%@", [self stringFromDate:date_Feb2_1000PST]);
NSLog(@"midnights between=%d", [self daysWithinEraFromDate:date_Feb1_2000PST toDate:date_Feb2_1000PST usingCalendar:cal]);
}
// based on "Listing 13" at
// https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW1
- (NSInteger)daysWithinEraFromDate:(NSDate *)startDate toDate:(NSDate *)endDate usingCalendar:(NSCalendar *)cal
{
NSInteger startDay=[cal ordinalityOfUnit:NSDayCalendarUnit
inUnit: NSEraCalendarUnit forDate:startDate];
NSInteger endDay=[cal ordinalityOfUnit:NSDayCalendarUnit
inUnit: NSEraCalendarUnit forDate:endDate];
return endDay-startDay;
}
- (NSDate *)dateFromStr:(NSString *)dateStr {
NSDateFormatter *df = nil;
df = [[NSDateFormatter alloc] init];
df.timeZone = [NSTimeZone timeZoneWithName:@"America/Los_Angeles"];
df.dateFormat = @"yyyyMMdd HHmm";
return [df dateFromString:dateStr];
}
- (NSString *)stringFromDate:(NSDate *)date {
NSDateFormatter *df = nil;
df = [[NSDateFormatter alloc] init];
df.timeZone = [NSTimeZone timeZoneWithName:@"America/Los_Angeles"]; // native timezone here
df.dateFormat = @"yyyy-MM-dd HH:mm Z";
return [df stringFromDate:date];
}