-->

错误的日期从NSDateComponents回来(Wrong date comes back fro

2019-09-02 20:59发布

这是为什么给我错误的日期?

 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

编辑

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

例如:

起始日期是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!");
 }

Answer 1:

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

记录日期在TZ +0000总是完成。 例如,如果你在欧洲的中心,你将有(预期?)日期2013年6月28日05:00:00 +0200,但日志将显示normilzed日期2013年6月28日03:00:00 +0000。 这是相同的日期和时间! 很简单,就是以不同的方式表达。

+++

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



Answer 2:

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

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


Answer 3:

这是因为你必须使用打印设备的时区的日期,否则它显示在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]);


文章来源: Wrong date comes back from NSDateComponents