在执行'dateFromString'时,NSDate是错误的

时间:2015-07-01 16:02:05

标签: objective-c nsdate nsdateformatter

我在英国,在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);

2 个答案:

答案 0 :(得分:1)

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

如果您需要在特定时区内使用该时刻的字符串表示,请像使用stringFromDate:一样使用-[NSCalendar components:fromDate:]

如果您需要知道特定时区的小时/分钟数值,请使用[calendar setTimeZone:...]; NSDateComponents* components = [calendar components:(NSHourCalendarUnit|NSMinuteCalendarUnit) fromDate:date];

<table style="black">

答案 1 :(得分:1)

日期格式化程序默认为本地时区。如果您想要一个不同的时区,请指定它。 NSLog日期使用默认为GMT(UTC)的'NSDate description`方法。

检查代码:

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.