【发布时间】:2013-02-01 18:52:18
【问题描述】:
我在这里遗漏了什么吗?似乎 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];
}
【问题讨论】:
-
Number of days between two NSDates 的可能副本。但请确保您使用正确的答案:stackoverflow.com/a/4739650/937822 并使用您的日历而不是他的函数创建的日历。
-
@lnafziger 不,据我所知,它不是重复的。在发布之前,我广泛搜索了这样的答案。如果我能提供帮助,我显然宁愿不输入所有内容。我问这个问题的全部原因是像你发布的那样的 b/c 答案在所有时区都不能正常工作。我查看了那里的所有答案,但似乎没有一个能解决这个问题。
-
“据我所知”?你试过了吗?我做到了。它完全按照您的要求工作。 “给定时区中两个日期之间的午夜数”如果,正如我在原始评论中所说,您使用相同的日历而不是该函数中的日历。同样,使用 stackoverflow.com/a/4739650/937822 作为您的函数的基础,将使用的默认日历替换为您要使用的日历,并且它可以完美运行。如果我遗漏了什么,那么一定要告诉我什么不起作用,我很乐意研究它,因为我非常了解 iOS 的日期/时间方法。
-
你认为我们应该保持这个问题的开放,因为它与任何有相同时区问题的人有关吗?对于偶然发现另一个问题的人来说,列出的许多答案中的一个答案是唯一一个在时区中实际正确工作的答案并不明显,尤其是因为它不是选择的答案。
-
好吧,一个问题被关闭并不意味着它就消失了。事实上,SO 鼓励人们留下封闭的问题(而不是删除或合并它们)作为寻找特定答案的人的“标志帖子”。此外,我不会担心:问题是否关闭不取决于您或我,而是取决于社区。他们将在他们认为合适的时候投票,是否关闭它的问题将自行解决。最后,我很高兴您找到了答案,这就是我们最初来到这里的原因!
标签: ios cocoa-touch cocoa nsdate