NSDate 在执行 'dateFromString' 时出错

NSDate is wrong when doing 'dateFromString'

我在英国,在处理 iOS 中的日期时,它们总是晚一小时(晚一小时),我需要的是来自 NSDate 的正确时间。我做了以下操作,但我得到了两个不同的时间:

 NSDate *today = [NSDate date];

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
 dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
 [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

 NSLog(@"NSDate %@",today);
 NSLog(@"Time %@", [dateFormatter stringFromDate:today]);
 NSDate*stringDate = [dateFormatter dateFromString:[dateFormatter stringFromDate:today]];
 NSLog(@"Time date %@",stringDate);

这是记录的内容:

NSDate 2015-07-01 16:07:22 +0000
Time 2015-07-01 17:07:22
Time date 2015-07-01 16:07:22 +0000

为什么会这样?我错过了一些明显的东西吗?当然,如果字符串日期是正确的,那么执行 dateFromString 应该会产生正确的结果吗?

我需要 NSDate 的原因是我可以使用 [myTime timeIntervalSince1970]

获得正确的秒数
2015-07-01 17:07:22 //is the correct date

我期待一个与我的日期和时间相符的 NSDate 对象。

更新 下面的答案帮助我找到了错误的地方,所以我改变了我的方法,我能够通过以下操作获得当前时间戳:

NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
    NSDate *curdate = [dateFormatter dateFromString:timeStamp];
    int unix_timestamp =  [curdate timeIntervalSince1970];
    NSDate* referenceDate = [NSDate dateWithTimeIntervalSince1970: 0];
    NSTimeZone* timeZone = [NSTimeZone systemTimeZone];
    int offset = (int)[timeZone secondsFromGMTForDate: referenceDate];
    int currentTimestamp = unix_timestamp + offset;

    NSLog(@"CUrrent time stamp %d",currentTimestamp);

NSDate 是一个绝对时刻,它没有时区。您拥有的日期对象是正确的:它正是执行代码的时刻。

如果您需要特定时区的那个时刻的字符串表示,请像您一样使用 stringFromDate:

如果您需要了解特定时区中 hour/minute 的数值,请使用 -[NSCalendar components:fromDate:]

[calendar setTimeZone:...];
NSDateComponents* components = [calendar components:(NSHourCalendarUnit|NSMinuteCalendarUnit) fromDate:date];

日期格式化程序默认为本地时区。如果您想要不同的时区,请指定它。 NSLog 日期使用默认为 GMT (UTC) 的“NSDate</code>description”方法。 </p> <p>检查代码:</p> <pre><code>NSDate *today = [NSDate date]; // Creates today's data in GMT (UTC) All NSDates are referenced to GMT. NSLog(@"NSDate %@",today); (moved up for explanation ordering) // NSDate 2015-07-01 16:07:22 +0000 // Displays the date in GMT NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]]; // Creates a date for matter with the system timezone NSLog(@"Time %@", [dateFormatter stringFromDate:today]); // Time 2015-07-01 17:07:22 // Creates a string representation in the system timezone and displays it NSDate*stringDate = [dateFormatter dateFromString:[dateFormatter stringFromDate:today]]; // Creates a date from the string taking into the system timezone NSLog(@"Time date %@",stringDate); // Time date 2015-07-01 16:07:22 +0000 // Displays the date in GMT.