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.
我在英国,在处理 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.