错误的日期从NSDateComponents回来

问题描述:

为什么这给了我错误的日期?错误的日期从NSDateComponents回来

NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; 
    NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]]; 
    [components setYear:2013]; 
    [components setMonth:06]; 
    [components setDay:28]; 
    [components setHour:5]; 
    [components setMinute:00]; 
    NSDate *startDate1 = [myCalendar dateFromComponents:components]; 
    NSLog(@"start date is %@",startDate1); 

起始日期是2013年6月28日03:00:00 +0000

编辑

我想要做的是以下几点。我有一个开始和结束。

例如:

起始日期是2013年6月28日05:00

结束日期为:2013年6月29日04:59

然后我想检查当前日期介于开始日期和结束日期之间。我正在使用以下内容。

NSComparisonResult result1 = [now compare:startDate1]; 
    NSComparisonResult result2 = [now compare:endDate1]; 

if (result2 == NSOrderedSame && result1 == NSOrderedSame) { 
     NSLOG(@"OKE!"); 
} 
+0

您的日期值取决于时区。将其更改为您当地的时区将解决您的问题。设置 - 常规 - 日期和时间。 – brianLikeApple 2013-05-13 11:17:46

大概的日期是正确的,但你误解了这个日志:

记录的日期总是在TZ +0000完成。例如,如果您在中欧,您将拥有(预计?)日期2013-06-28 05:00:00 +0200,但日志会显示正式日期2013-06-28 03:00:00 +0000。这是相同的日期和时间!它只是以不同的方式表达。

+++

如果你的组件是TZ +0000,也应该设置日历的时区。

这是因为您必须使用设备的时区打印日期,否则以UTC显示。

NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; 
    NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]]; 
    [components setYear:2013]; 
    [components setMonth:06]; 
    [components setDay:28]; 
    [components setHour:5]; 
    [components setMinute:00]; 
    NSDate *startDate1 = [myCalendar dateFromComponents:components]; 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    formatter.timeZone = [NSTimeZone systemTimeZone]; 
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; 
    NSLog(@"%@", [formatter stringFromDate:startDate1]); 
+0

嗨,我用一点点细节编辑了我的问题。我想我无法比较你喜欢的字符串吗? – Steaphann 2013-05-13 11:24:29

您可以检查当前日期是否是两个日期这样之间:

NSDate *now = [NSDate date]; 
BOOL betweenStartAndEnd = ([startDate compare:now] == NSOrderedAscending && [endDate compare:now] == NSOrderedDescending); 

你的代码实际上检查测试日期是否等于(NSOrderedSame)同时开始和结束日期(这是当然不是)

result2 == NSOrderedSame && result1 == NSOrderedSame 

见我的扩展的例子:

NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; 
NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]]; 
[components setYear:2013]; 
[components setMonth:05]; 
[components setDay:13]; 
[components setHour:18]; 
[components setMinute:00]; 
NSDate *startDate = [myCalendar dateFromComponents:components]; 
[components setDay:15]; 
NSDate *endDate = [myCalendar dateFromComponents:components]; 

NSDate *now = [NSDate date]; 
BOOL betweenStartAndEnd = ([startDate compare:now] == NSOrderedAscending && [endDate compare:now] == NSOrderedDescending); 

NSLog(@"Date %@ %@ between %@ and %@", now, betweenStartAndEnd ? @"IS" : @"IS NOT", startDate, endDate); 

此打印出此控制台:

Date 2013-05-13 15:44:06 +0000 IS NOT between 2013-05-13 16:00:00 +0000 and 2013-05-15 16:00:00 +0000